superman

聚精会神搞建设 一心一意谋发展
posts - 190, comments - 17, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

ZOJ 1103 - Hike on a Graph

Posted on 2008-04-07 10:58 superman 阅读(420) 评论(0)  编辑 收藏 引用 所属分类: ZOJ
 1 /* Accepted 1103 C++ 00:00.08 1188K */
 2 #include <queue>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 struct Rec { int p1, p2, p3, cnt; };
 8 
 9 int main()
10 {
11     int n, p1, p2, p3;
12     while((cin >> n) && n)
13     {
14         cin >> p1 >> p2 >> p3;
15         
16         char m[51][51];
17         for(int i = 1; i <= n; i++)
18             for(int j = 1; j <= n; j++)
19                 cin >> m[i][j];
20         
21         Rec cur = {p1, p2, p3, 0};
22         queue <Rec> rec;
23         rec.push(cur);
24         
25         bool isRepeat[51][51][51= {false};
26         isRepeat[p1][p2][p3] = true;
27         bool find = false;
28         
29         while(rec.empty() == false)
30         {
31             cur = rec.front(); rec.pop();
32             
33             if(cur.p1 == cur.p2 && cur.p2 == cur.p3)
34             {
35                 cout << cur.cnt << endl;
36                 find = true;
37                 break;
38             }
39             
40             for(int i = 1; i <= n; i++)
41                 if(cur.p1 != i && m[cur.p1][i] == m[cur.p2][cur.p3])
42                     if(isRepeat[i][cur.p2][cur.p3] == false)
43                     {
44                         isRepeat[i][cur.p2][cur.p3] = true;
45                         Rec tmp = {i, cur.p2, cur.p3, cur.cnt + 1};
46                         rec.push(tmp);
47                     }
48             for(int i = 1; i <= n; i++)
49                 if(cur.p2 != i && m[cur.p2][i] == m[cur.p1][cur.p3])
50                     if(isRepeat[cur.p1][i][cur.p3] == false)
51                     {
52                         isRepeat[cur.p1][i][cur.p3] == true;
53                         Rec tmp = {cur.p1, i, cur.p3, cur.cnt + 1};
54                         rec.push(tmp);
55                     }
56             for(int i = 1; i <= n; i++)
57                 if(cur.p3 != i && m[cur.p3][i] == m[cur.p1][cur.p2])
58                     if(isRepeat[cur.p1][cur.p2][i] == false)
59                     {
60                         isRepeat[cur.p1][cur.p2][i] = true;
61                         Rec tmp = {cur.p1, cur.p2, i, cur.cnt + 1};
62                         rec.push(tmp);
63                     }
64         }
65         if(find == false)
66             cout << "impossible" << endl;
67     }
68     
69     return 0;
70 }
71 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理