POJ 1573 Robot Motion

提交一次就accept了,

唯一的瑕疵是又调试了,因为自己的逻辑不清楚,导致sign数组的赋值与函数调用的关系没弄清楚。

应该从第一次调用时就开始考虑所有数据,而不是从下一次着眼,想当然了。。。

View Code
  1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4
5 #define ONLINE
6
7 using namespace std;
8
9 int column,row,begin;
10 int sign[11][11];
11 char map[11][11];
12 int steps;
13
14 void online()
15 {
16 #ifdef ONLINE
17 #else
18 freopen("F:\\t1.txt","r",stdin);
19 freopen("F:\\t2.txt","w",stdout);
20 #endif
21 }
22
23 bool bound(int x,int y)
24 {
25 if(x<1||x>row||y<1||y>column)
26 {
27 cout<<steps<<" step(s) to exit"<<endl;
28 return true;
29 }
30 return false;
31 }
32
33 void imitate(int x,int y)
34 {
35 if(sign[x][y]!=0)
36 {
37 cout<<sign[x][y]-1<<" step(s) before a loop of "<<steps-sign[x][y]+1<<" step(s)"<<endl;
38 return ;
39 }
40 sign[x][y]=++steps;
41 if(map[x][y]=='N')
42 {
43 int m=x-1,n=y;
44 if(!bound(m,n))
45 {
46
47 imitate(m,n);
48 // sign[m][n]=++steps;
49 }
50 }
51 else if(map[x][y]=='E')
52 {
53 int m=x,n=y+1;
54 if(!bound(m,n))
55 {
56
57 imitate(m,n);
58 // sign[m][n]=++steps;
59 }
60 }
61 else if(map[x][y]=='S')
62 {
63 int m=x+1,n=y;
64 if(!bound(m,n))
65 {
66
67 imitate(m,n);
68 // sign[m][n]=++steps;
69 }
70 }
71 else if(map[x][y]=='W')
72 {
73 int m=x,n=y-1;
74 if(!bound(m,n))
75 {
76
77 imitate(m,n);
78 // sign[m][n]=++steps;
79 }
80 }
81 }
82
83 void init()
84 {
85 cin>>row>>column>>begin;
86 while(column!=0||row!=0||begin!=0)
87 {
88 steps=0;
89 memset(sign,0,sizeof(sign));
90 memset(map,'0',sizeof(map));
91 for(int i=1;i<=row;i++)
92 for(int j=1;j<=column;j++)
93 {
94 cin>>map[i][j];
95 }
96 imitate(1,begin);
97 cin>>row>>column>>begin;
98 }
99 }
100
101
102
103 int main()
104 {
105 online();
106 init();
107 return 0;
108 }

原文地址:https://www.cnblogs.com/YipWingTim/p/2219782.html