问题:Robot Motion POJ - 1573
题目描述不写了,就是判断机器人会不会走出图或在图内成环
分析:
代码好想,用visited[]记录走过几步,循环了,就先输出这一步之前的数值,然后用现在的步数减去其就是环的长度;出图了,就直接输出步数;
但是!!注意起点我们就算赋值,也是赋值为0,这就跟没赋值一样,如果成环的时候是回到起点的话,就会出错,所以从起点开始,从1开始填,输出的时候-1就可以了
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<queue> #include<map> #include<stack> #include<set> #include<bitset> #include<list> #define UP(i,x,y) for(int i=x;i<=y;i++) #define DOWN(i,x,y) for(int i=x;i>=y;i--) #define MEM(a,x) memset(a,x,sizeof(a)) #define W(a) while(a) #define ll long long #define INF 0x3f3f3f3f #define EXP 1e-10 #define lowbit(x) (x&-x) using namespace std; char pic[15][15]; int visited[15][15]; int main(){ int n,m,s; cin>>n>>m>>s; while(n!=0||m!=0||s!=0){ MEM(pic,0); MEM(visited,0); UP(i,1,n){ UP(j,1,m){ cin>>pic[i][j]; } } int x=1,y=s,step=1,k=1; while(x>=1&&x<=n&&y>=1&&y<=m){ if(visited[x][y]){ cout<<visited[x][y]-1<<" step(s) before a loop of "<<step-visited[x][y]<<" step(s)"<<endl; k=0;break; } else{ visited[x][y]=step; } if(pic[x][y]=='N'){x--;step++;} else if(pic[x][y]=='S'){x++;step++;} else if(pic[x][y]=='W'){y--;step++;} else if(pic[x][y]=='E'){y++;step++;} } if(k){ cout<<step-1<<" step(s) to exit"<<endl; } cin>>n>>m>>s; } return 0; }