http://poj.org/problem?id=3083纠结了好久 被它的转向搞晕 了
WA两次 加一else AC。。
设置四个方向 初始化方向自己算出来 初始化在数组中 dfs+bfs
左 就是当前方向向左 左走不动就逆时针走下一个方向 依次类推 右同样的方式
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[50][50],so[2]; 6 int pr[7],dis[4][2]={-1,0,0,-1,1,0,0,1},vis[50][50],n,m,flag; 7 int dir[2][4][4] = {{{1, 0, 3, 2}, {2, 1, 0, 3}, {3, 2, 1, 0}, {0, 3, 2, 1}},{{3, 0, 1, 2}, {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}}}; 8 struct node 9 { 10 int x,y,num; 11 }q[100010]; 12 int judge(int x,int y) 13 { 14 if(x<1||x>n||y<1||y>m) 15 return 0; 16 if(s[x][y]=='#') 17 return 0; 18 return 1; 19 } 20 void bfs() 21 { 22 int i,j,p = 0, d = 1; 23 memset(vis,0,sizeof(vis)); 24 q[d].x = so[0]; 25 q[d].y = so[1]; 26 q[d].num = 1; 27 vis[so[0]][so[1]] = 1; 28 while(p!=d) 29 { 30 p++; 31 int tx = q[p].x; 32 int ty = q[p].y; 33 int tnum = q[p].num; 34 if(s[tx][ty]=='E') 35 { 36 pr[5] = tnum; 37 break; 38 } 39 for(i = 0 ; i < 4 ; i++) 40 { 41 int nx = tx+dis[i][0]; 42 int ny = ty+dis[i][1]; 43 if(!vis[nx][ny]&&judge(nx,ny)) 44 { 45 vis[nx][ny] = 1; 46 d++; 47 q[d].x = nx; 48 q[d].y = ny; 49 q[d].num = tnum+1; 50 } 51 } 52 } 53 } 54 void dfs(int x,int y,int d,int f) 55 { 56 pr[f]++; 57 if(s[x][y]=='E') 58 return ; 59 int i,j,td,tx,ty; 60 td = dir[f][d][0]; 61 tx = x+dis[td][0]; 62 ty = y+dis[td][1]; 63 if(judge(tx,ty)) 64 dfs(tx,ty,td,f); 65 else 66 { 67 td = dir[f][d][1]; 68 tx = x+dis[td][0]; 69 ty = y+dis[td][1]; 70 if(judge(tx,ty)) 71 dfs(tx,ty,td,f); 72 else 73 { 74 td = dir[f][d][2]; 75 tx = x+dis[td][0]; 76 ty = y+dis[td][1]; 77 if(judge(tx,ty)) 78 dfs(tx,ty,td,f); 79 else 80 { 81 td = dir[f][d][3]; 82 tx = x+dis[td][0]; 83 ty = y+dis[td][1]; 84 if(judge(tx,ty)) 85 dfs(tx,ty,td,f); 86 } 87 } 88 } 89 } 90 int main() 91 { 92 int i,j,k,t,in; 93 cin>>t; 94 while(t--) 95 { 96 cin>>m>>n; 97 pr[0] = 0; 98 pr[1] = 0; 99 for(i = 1 ; i <= n ; i++) 100 { 101 getchar(); 102 for(j = 1 ; j <= m ; j++) 103 { 104 cin>>s[i][j]; 105 if(s[i][j]=='S') 106 { 107 so[0] = i; 108 so[1] = j; 109 if(so[0]==n) 110 in = 0; 111 if(so[0]==1) 112 in = 2; 113 if(so[1]==m) 114 in = 1; 115 if(so[1]==1) 116 in = 3; 117 } 118 } 119 } 120 bfs(); 121 for(i = 0 ; i < 2 ; i++) 122 { 123 memset(vis,0,sizeof(vis)); 124 vis[so[0]][so[1]] = 1; 125 dfs(so[0],so[1],in,i); 126 } 127 cout<<pr[0]<<" "<<pr[1]<<" "<<pr[5]<<endl; 128 } 129 return 0; 130 }