題目描述:
轉載自:https://blog.csdn.net/h1021456873/article/details/54572767
題意:
給你一個轉輪,有5種顏色,爲了5中顏色的位置是確定的,爲了方便處理我們用01234來表示綠,黑,紅,藍,白。輪子可以沿着它的方向滾動(只能是它當前的方向不能相反方向),每滾動一次會到達另一個格子,着地的顏色會改變,變了之前顏色的下一個,例如當前是綠色着地下一次就是黑色,依次是紅藍白。也可以原地轉動(順逆時針都可以),原地轉動其實就是改變了輪子的滾動方向,原地轉動每次能轉90度。原地轉動一次和滾動一次時間都是1秒。另外輪子有4個方向,上北下南左西又東。
思路: 開一個四維數組標記狀態 f【x】【y】【d】【c】 在(x,y)點,方向爲d,車輪的顏色爲c的狀態是否被標記過, 這個數組其實就是用來剪枝,避免陷入死循環!!!!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int N = 33; 9 char s[N][N]; 10 struct node 11 { 12 int x,y,d,c,time; 13 }; 14 queue<node>que; 15 int f[N][N][10][10]; 16 int n,m; 17 int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0}; 18 node e; 19 int bfs() 20 { 21 int i,j,x,y,d,c; 22 while(!que.empty()){ 23 node t = que.front(); 24 que.pop(); 25 if(t.x==e.x && t.y==e.y && t.c==0) return t.time; 26 ////////先考慮轉向///////////////////// 27 c=t.c; 28 d=(t.d+1)%4; 29 if(!f[t.x][t.y][d][c]){ 30 f[t.x][t.y][d][c]++; 31 que.push((node){t.x,t.y,d,c,t.time+1}); 32 // printf("%d %d %d %d %d\n",t.x,t.y,d,c,t.time+1); 33 } 34 d=(t.d-1+4)%4; 35 if(!f[t.x][t.y][d][c]) { 36 f[t.x][t.y][d][c]++; 37 que.push((node){t.x,t.y,d,c,t.time+1}); 38 // printf("%d %d %d %d %d\n",t.x,t.y,d,c,t.time+1); 39 } 40 ////////考慮向前走//////////////////// 41 c=(t.c+1)%5; 42 x=t.x+dx[t.d],y=t.y+dy[t.d],d=t.d; 43 if(x<0||x>=n||y<0||y>=m||s[x][y]=='#') continue; 44 if(f[x][y][d][c]) continue; 45 f[x][y][d][c]++; 46 que.push((node){x,y,d,c,t.time+1}); 47 // printf("%d %d %d %d %d\n",x,y,d,c,t.time+1); 48 } 49 return -1; 50 } 51 52 int main() 53 { 54 node start; 55 int i,j,T=0; 56 while(scanf("%d%d",&n,&m)!=EOF) { 57 if(n==0 && m==0) break; 58 if(T) printf("\n"); 59 T++; 60 while(!que.empty()) que.pop(); 61 memset(f,0,sizeof(f)); 62 for(i=0;i<n;i++) { 63 scanf("%s",s[i]); 64 for(j=0;j<m;j++) { 65 if(s[i][j]=='S') start.x=i,start.y=j; 66 if(s[i][j]=='T') e.x=i,e.y=j; 67 } 68 } 69 start.d=1,start.c=0,start.time=0; 70 f[start.x][start.y][start.d][start.c]=1; 71 que.push(start); 72 int ans=bfs(); 73 printf("Case #%d\n",T); 74 if(ans<0) printf("destination not reachable\n"); 75 else printf("minimum time = %d sec\n",ans); 76 } 77 return 0; 78 }