The Monocycle(bfs)

題目描述:

轉載自: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 }
View Code