poj1573解题报告

题目大意:给定一个由SNWE几个字母组成的地图,这四个字母代表着四个方向,给定起点,让你判断是否能走出这个地图,或走到某步的时候形成一个环。。。

poj1573解题报告_第1张图片

Sample Input

3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0

Sample Output

10 step(s) to exit
3 step(s) before a loop of 8 step(s)

 

 

思路:这个题还是走迷宫的变形,先将step入队,然后将这个人走过每个点的坐标依次入队,如果发现其坐标在地图外则说明能走出地图,如果当前的点和以前走过的某点坐标一致则说明能形成环。。。

 

 

 

#include<iostream> using namespace std; int queue[100000],head,rear,m,n,flag; char map[20][20]; int pop(){ return queue[head++%100000]; } void push(int i){ queue[rear++%100000]=i; } int bfs() { int step,i,path[110][2]; while(head!=rear) { step=pop(); for(i=0;i<=step;i++) { path[i][0]=pop(); path[i][1]=pop(); } if(path[step][0]<0||path[step][0]>=m||path[step][1]<0||path[step][1]>=n) return step; for(i=0;i<=step;i++) if(i<step&&path[step][0]==path[i][0]&&path[step][1]==path[i][1]) { flag=i; return step-i; } push(step+1); for(i=0;i<=step;i++) { push(path[i][0]); push(path[i][1]); } if(map[path[step][0]][path[step][1]]=='N') { push(path[step][0]-1); push(path[step][1]); } if(map[path[step][0]][path[step][1]]=='S') { push(path[step][0]+1); push(path[step][1]); } if(map[path[step][0]][path[step][1]]=='E') { push(path[step][0]); push(path[step][1]+1); } if(map[path[step][0]][path[step][1]]=='W') { push(path[step][0]); push(path[step][1]-1); } } } int main() { int i,j,start,o; while(cin>>m>>n>>start&&m) { head=rear; flag=-1; for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>map[i][j]; push(0); push(0); push(start-1); o=bfs(); if(flag==-1) cout<<o<<" step(s) to exit"<<endl; else cout<<flag<<" step(s) before a loop of "<<o<<" step(s)"<<endl; } return 0; }

你可能感兴趣的:(input,Path,output)