题目链接:
https://vjudge.net/problem/POJ-1573
题目大意:
有一个N*M的区域,机器人从第一行的第几列进入,该区域全部由'N' , 'S' , 'W' , 'E' ,走到某个区域的时候只能按照该区域指定的方向进行下一步,问你机器人能否走出该片区域,若不能,输入开始绕圈的步数和圈的大小。
思路:
一开始一直WA,后来发现是因为vis数组的问题,这里设置的vis数组表示到该点走的步数,最开始是0步,这和初始化是0步是一样的,会导致如果再次走到这个点,就会判断成该点没有走过,后来初始化成-1,A了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<stack> 8 #include<map> 9 using namespace std; 10 typedef long long ll; 11 const int maxn = 1e2 + 10; 12 const int INF = 1 << 30; 13 int dir[4][2] = {1,0,0,1,-1,0,0,-1}; 14 int T, n, m, x; 15 map<char, int>M; 16 int Map[20][20]; 17 int vis[20][20]; 18 void dfs(int x, int y, int d) 19 { 20 //cout<<x<<" "<<y<<" "<<d<<endl; 21 if(x <= 0 || x > n || y <= 0 || y > m) 22 { 23 cout<<d<<" step(s) to exit"<<endl; 24 return; 25 } 26 if(vis[x][y] != -1) 27 { 28 cout<<vis[x][y]<<" step(s) before a loop of "<<d - vis[x][y]<<" step(s)"<<endl; 29 return; 30 } 31 int cn = Map[x][y]; 32 vis[x][y] = d; 33 dfs(x + dir[cn][0], y + dir[cn][1], d + 1); 34 } 35 int main() 36 { 37 M['S'] = 0; 38 M['E'] = 1; 39 M['N'] = 2; 40 M['W'] = 3; 41 42 while(cin >> n >> m >> x) 43 { 44 if(!n && !m && !x)break; 45 memset(vis, -1, sizeof(vis)); 46 //这里不能设置成0,应该设置成-1,因为设置成0的话,第一步出发设置的也是0,这样就会把第一步标记成未走过的点了 47 memset(Map, 0, sizeof(Map)); 48 char c; 49 for(int i = 1; i <= n; i++) 50 { 51 for(int j = 1;j <= m; j++) 52 { 53 cin >> c; 54 Map[i][j] = M[c]; 55 } 56 } 57 dfs(1, x, 0); 58 } 59 return 0; 60 }