POJ-1573 Robot Motion模拟

题目链接:

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 }

 

转载于:https://www.cnblogs.com/fzl194/p/8718787.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值