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; } }转载于:https://www.cnblogs.com/Dup4/p/9433382.html
相关资源:JAVA上百实例源码以及开源项目