hdu 1252 BFS
1 /* 2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色;有三个玩家ABC的三张纸片分别初始在 3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜 4 色相同;问最少要走多少步。(题意太难懂了,看了别人的说明才弄懂了题意) 5 6 题解:BFS 7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然 8 后初步列出所有信息,三个点得位置以及步长的,其中要求的是最短步长,一般求最短的距离当然会首先想到BFS,然后 9 就可以想到,到达同一个位置可以有不同的步长,而BFS保证了步长最短,那么就再通过其他的东西来保证三个点的位置 10 状态不重复即可,那样显然就会想到一个vis[][][]去记录,而且50*50*50的空间完全够,而且步长的变化是+1的变化, 11 因此可以一点点的+1从而逐渐找到最短路径,由于是BFS,因此每一次搜索到某个点已经保证该位置状态已经是最优。 12 */ 13 #include <cstdio> 14 #include <cstring> 15 #include <algorithm> 16 17 bool vis[55][55][55]; 18 char gra[55][55]; 19 20 struct node 21 { 22 int p1,p2,p3; 23 int step; 24 }Q[150000]; 25 int front,tail; 26 27 int bfs(int n, node now) 28 { 29 memset(vis,false,sizeof(vis)); 30 front = tail = 0; 31 now.step = 0; 32 Q[tail++] = now; 33 vis[now.p1][now.p2][now.p3] = true; 34 while (front < tail) 35 { 36 now = Q[front++]; 37 int p1 = now.p1, p2 = now.p2, p3 = now.p3; 38 if (p1 == p2 && p2 == p3) 39 return now.step; 40 node tmp = now; 41 tmp.step++; 42 for(int i=0; i<n; i++) 43 { 44 // 判断边是否能走,已经是否已经访问 45 if (gra[p1][i] == gra[p2][p3] && !vis[i][p2][p3]) 46 { 47 tmp.p1 = i; 48 Q[tail++] = tmp; 49 vis[i][p2][p3] = true; 50 } 51 } 52 53 tmp = now; 54 tmp.step++; 55 for(int i=0; i<n; i++) 56 { 57 if (gra[p2][i] == gra[p1][p3] && !vis[p1][i][p3]) 58 { 59 tmp.p2 = i; 60 Q[tail++] = tmp; 61 vis[p1][i][p3] = true; 62 } 63 } 64 65 tmp = now; 66 tmp.step++; 67 for(int i=0; i<n; i++) 68 { 69 if (gra[p3][i] == gra[p1][p2] && !vis[p1][p2][i]) 70 { 71 tmp.p3 = i; 72 Q[tail++] = tmp; 73 vis[p1][p2][i] = true; 74 } 75 } 76 } 77 return -1; 78 } 79 80 int main(void) 81 { 82 int n; 83 while (~scanf("%d",&n) && n) 84 { 85 node start; 86 scanf("%d%d%d%*c",&start.p1,&start.p2,&start.p3); 87 start.p1--; 88 start.p2--; 89 start.p3--; 90 char s[105]; 91 for(int i=0; i<n; i++) 92 { 93 gets(s); 94 for(int j=0; j<n; j++) 95 gra[i][j] = s[j*2]; 96 } 97 int ans = bfs(n,start); 98 if (ans < 0) 99 printf("impossible\n"); 100 else 101 printf("%d\n",ans); 102 } 103 return 0; 104 }