poj1573
题意:给出一个矩形,N,E,S,W分别代表进行移动的方向,如果走出矩形网格则输出经过的网格数,如果在矩形网格内循环,则输出没进入循环之前所走过的网格数和循环所经过的网格数;
思路:创建两个数组,一个字符数组存每个网格中所要进行的操作,另一个整型数组代表状态,0代表没走过,1代表走过了,然后模拟;
再提醒一点,建立的字符和整型数组要和题目中建里的一模一样,因为这个我又WA了一发、
#include<iostream> #include<cstring> using namespace std; const int qq=15; int gid[qq][qq];char s[qq][qq]; int main() { int n,m,k; while(cin >> n >> m >> k) { cin.get(); if(n==0&&m==0&&k==0) break; memset(gid,0,sizeof(gid)); for(int i=0;i<=m+1;++i){ gid[0][i]=1;gid[n+1][i]=1; //外围标记 } for(int i=0;i<=n+1;++i){ //外围标记 gid[i][0]=1;gid[i][m+1]=1; } for(int j,i=1;i<=n;++i){ for(j=1;j<=m;++j) s[i][j]=cin.get(); cin.get(); } int x,y;x=k;y=1;int tot=0; while(!gid[y][x]){ while(!gid[y][x]&&s[y][x]=='N'){ gid[y][x]=1;y-=1;++tot; } while(!gid[y][x]&&s[y][x]=='E'){ gid[y][x]=1;x+=1;++tot; } while(!gid[y][x]&&s[y][x]=='S'){ gid[y][x]=1;y+=1;++tot; } while(!gid[y][x]&&s[y][x]=='W'){ gid[y][x]=1;x-=1;++tot; } } if(x<1||y<1||x>m||y>n) cout << tot << " step(s) to exit\n"; else{ int count=0; while(gid[y][x]){ //计算循环所经过的网格数 此时1,0的意义互换 while(gid[y][x]&&s[y][x]=='N'){ gid[y][x]=0;y-=1;++count; } while(gid[y][x]&&s[y][x]=='E'){ gid[y][x]=0;x+=1;++count; } while(gid[y][x]&&s[y][x]=='S'){ gid[y][x]=0;y+=1;++count; } while(gid[y][x]&&s[y][x]=='W'){ gid[y][x]=0;x-=1;++count; } } cout << tot-count << " step(s) before a loop of " << count << " step(s)\n"; } } }