codeforce挂掉了,做着题目跑过来写下题解。
搜索题,典型的广搜。其实只是广搜的模型而已。
回头看看这题,不是搜索,是模拟题,做题太快了,不考虑很多问题,直接干了。
用到了队列记录,用map做记录标记已找过。方法很多
如果接触过这类型的,应该很简单。
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #include <map> 5 using namespace std; 6 7 map<int,int> mp; 8 int maz[15][15]; 9 int n,m,st; 10 void dir(int p,int s,int t,int &a,int &b) 11 { 12 if(p=='S') a=s+1,b=t; 13 if(p=='W') a=s,b=t-1; 14 if(p=='E') a=s,b=t+1; 15 if(p=='N') a=s-1,b=t; 16 } 17 int is_out(int nx,int ny){ 18 if(nx < 0 || nx >= n || ny < 0 || ny >= m) return 1; 19 return 0; 20 } 21 #include <iostream> 22 int main() 23 { 24 while(scanf("%d %d",&n,&m) , n+m) 25 { 26 scanf("%d",&st); 27 mp.clear(); 28 st--; 29 for(int i=0;i<n;i++) 30 { 31 char s[15]; 32 scanf("%s",s); 33 for(int j=0;j<m;j++) 34 { 35 maz[i][j] = s[j]; 36 } 37 } 38 int cnt = 1; 39 int sta = st; 40 queue<int> q; 41 q.push(sta); 42 mp[sta]=1; 43 while(!q.empty()) 44 { 45 int nx,ny; 46 int next = q.front();q.pop(); 47 int kx=next/m,ky=next%m; 48 dir(maz[kx][ky],kx,ky,nx,ny); 49 //cout<<nx<<ny; 50 if(is_out(nx,ny)) 51 { 52 printf("%d ",cnt); 53 printf("step(s) to exit "); 54 break; 55 } 56 else if(mp[nx*m+ny]) 57 { 58 printf("%d step(s) before a loop of %d step(s) " 59 ,mp[nx*m+ny]-1,cnt-mp[nx*m+ny]+1); 60 break; 61 } 62 mp[nx*m+ny] = ++cnt; 63 q.push(nx*m+ny); 64 } 65 } 66 return 0; 67 }