Kattis - glitchbot 【DFS】

Kattis - glitchbot 【DFS】

这里写图片描述

这里写图片描述

题意
有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的。我们需要找出那个指令,并且改成正确的。

思路
因为数据范围比较小,我们可以把每条指令都改一下 暴力搜索一下,能不能走到目标点,如果改了,可以 那么 这就是答案 直接输出 break 掉就可以了

AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#include <ctype.h>
#include <numeric>
#include <sstream>
using namespace std;

typedef long long LL;
const double PI  = 3.14159265358979323846264338327;
const double E   = 2.718281828459;  
const double eps = 1e-6;
const int MAXN   = 0x3f3f3f3f;
const int MINN   = 0xc0c0c0c0;
const int maxn   = 1e5 + 5; 
const int MOD    = 1e9 + 7;
int vis[55];
int n, m, t;
map <string, int> M;
int Move[4][2] =
{
     0, 1, //上  0
     0,-1, //下  1
    -1, 0, //左  2
     1, 0, //右  3
};
int dis, ans;
void change(int cur)
{
    if (dis == 0)
        dis += vis[cur];
    else if (dis == 1)
    {
        if (vis[cur] == 2)
            dis += 2;
        else
            dis += 1;
    }
    else if (dis == 2)
    {
        if (vis[cur] == 2)
            dis = 1;
        else
            dis = 0;
    }
    else if(dis == 3)
    {
        if (vis[cur] == 2)
            dis = 0;
        else
            dis = 1;
    }
}
void dfs(int x, int y, int cur)
{
    if (x == n && y == m && cur == t)
    {
        ans = 1;
        return;
    }
    else if(cur == t)
        return;
    else
    {
        if (vis[cur] == 1)
            dfs(x + Move[dis][0], y + Move[dis][1], cur + 1);
        else
        {
            change(cur);
            dfs(x, y, cur + 1);
        }
    }
}

int main()
{
    M["Forward"] = 1;
    M["Left"] = 2;
    M["Right"] = 3;
    scanf("%d%d%d", &n, &m, &t);
    memset(vis, 0, sizeof(vis));
    int i, j;
    string s;
    for (i = 0; i < t; i++)
    {
        cin >> s;
        vis[i] = M[s];
    }
    for (i = 0; i < t; i++)
    {
        int temp = vis[i];
        int flag = 0;
        for (j = 1; j <= 3; j++)
        {
            vis[i] = j;
            ans = 0;
            dis = 0;
            dfs(0, 0, 0);
            if (ans && j != temp)
            {
                flag = 1;
                break;
            }
        }
        if (flag)
        {
            printf("%d ", i + 1);
            if (j == 1)
                cout << "Forward\n";
            else if (j == 2)
                cout << "Left\n";
            else 
                cout << "Right\n";
            break;
        }
        else
            vis[i] = temp;
    }
}
posted @ 2018-03-03 22:39  Dup4  阅读(120)  评论(0编辑  收藏  举报