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 }

 

posted @ 2014-05-02 15:31  辛力啤  阅读(169)  评论(0编辑  收藏  举报