Kattis - glitchbot 【DFS】

时间:2023-03-08 18:44:55

Kattis - glitchbot 【DFS】

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;
}
}