題目大意:給定一個由SNWE幾個字母組成的地圖,這四個字母代表著四個方向,給定起點,讓你判斷是否能走出這個地圖,或走到某步的時候形成一個環。。。
Sample Input
3 6 5NEESWEWWWESSSNWWWW4 5 1SESWEEESNWNWEENEWSEN0 0 0
Sample Output
10 step(s) to exit3 step(s) before a loop of 8 step(s)
思路:這個題還是走迷宮的變形,先將step入隊,然後將這個人走過每個點的座標依次入隊,如果發現其座標在地圖外則說明能走出地圖,如果當前的點和以前走過的某點座標一致則說明能形成環。。。
#include<iostream><br />using namespace std;</p><p>int queue[100000],head,rear,m,n,flag;char map[20][20];<br />int pop(){return queue[head++%100000];}<br />void push(int i){queue[rear++%100000]=i;}<br />int bfs()<br />{<br />int step,i,path[110][2];<br />while(head!=rear)<br />{<br />step=pop();<br />for(i=0;i<=step;i++)<br />{path[i][0]=pop();path[i][1]=pop();}<br />if(path[step][0]<0||path[step][0]>=m||path[step][1]<0||path[step][1]>=n)<br />return step;<br />for(i=0;i<=step;i++)<br />if(i<step&&path[step][0]==path[i][0]&&path[step][1]==path[i][1])<br />{<br />flag=i;<br />return step-i;<br />}<br />push(step+1);<br />for(i=0;i<=step;i++)<br />{push(path[i][0]);push(path[i][1]);}<br />if(map[path[step][0]][path[step][1]]=='N')<br />{push(path[step][0]-1);push(path[step][1]);}<br />if(map[path[step][0]][path[step][1]]=='S')<br />{push(path[step][0]+1);push(path[step][1]);}<br />if(map[path[step][0]][path[step][1]]=='E')<br />{push(path[step][0]);push(path[step][1]+1);}<br />if(map[path[step][0]][path[step][1]]=='W')<br />{push(path[step][0]);push(path[step][1]-1);}</p><p>}</p><p>}<br />int main()<br />{<br />int i,j,start,o;<br />while(cin>>m>>n>>start&&m)<br />{<br />head=rear;<br />flag=-1;<br />for(i=0;i<m;i++)<br />for(j=0;j<n;j++)<br />cin>>map[i][j];<br />push(0);push(0);push(start-1);<br />o=bfs();<br />if(flag==-1)<br />cout<<o<<" step(s) to exit"<<endl;<br />else<br />cout<<flag<<" step(s) before a loop of "<<o<<" step(s)"<<endl;</p><p>}<br />return 0;<br />}