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 }
时间: 2024-10-23 06:51:29