superman

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

POJ 1915 - Knight Moves

Posted on 2008-06-21 14:37 superman 阅读(796) 评论(0)  编辑 收藏 引用 所属分类: POJ
 1 /* Accepted 2488K 688MS G++ 3131B */
 2 #include <queue>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 
 7 struct point { int x, y; } ;
 8 
 9 point dir[8= {
10     {-2+1}, {-1+2}, {+1+2}, {+2+1},
11     {+2-1}, {+1-2}, {-1-2}, {-2-1}
12 };
13 
14 int n, a[300][300], b[300][300];
15 
16 inline bool inside(const int x, const int y)
17 {
18     if(x >= 0 && x < n && y >= 0 && y < n)
19         return true;
20     return false;
21 }
22 
23 int bfs(int sx, int sy, int tx, int ty)
24 {
25     for(int i = 0; i < n; i++)
26     for(int j = 0; j < n; j++)
27         a[i][j] = b[i][j] = -1;
28     
29     a[sx][sy] = b[tx][ty] = 0;
30     
31     queue <point> l, r;
32     point sp = { sx, sy };
33     point tp = { tx, ty };
34     l.push(sp); r.push(tp);
35     
36     point cp;
37     while(l.empty() == false || r.empty() == false)
38     {
39         if(l.empty() == false)
40         {
41             cp = l.front(); l.pop();
42             for(int i = 0; i < 8; i++)
43             {
44                 int x = cp.x + dir[i].x;
45                 int y = cp.y + dir[i].y;
46                 if(inside(x, y))
47                 {
48                     if(a[x][y] == -1)
49                     {
50                         a[x][y] = a[cp.x][cp.y] + 1;
51                         point np = { x, y };
52                         l.push(np);
53                     }
54                     if(b[x][y] != -1)
55                         return a[x][y] + b[x][y];
56                 }
57             }
58         }
59         if(r.empty() == false)
60         {
61             cp = r.front(); r.pop();
62             for(int i = 0; i < 8; i++)
63             {
64                 int x = cp.x + dir[i].x;
65                 int y = cp.y + dir[i].y;
66                 if(inside(x, y))
67                 {
68                     if(b[x][y] == -1)
69                     {
70                         b[x][y] = b[cp.x][cp.y] + 1;
71                         point np = { x, y };
72                         r.push(np);
73                     }
74                     if(a[x][y] != -1)
75                         return a[x][y] + b[x][y];
76                 }
77             }
78         }
79     }
80 }
81 
82 int main()
83 {
84     cin >> n;
85     while(cin >> n)
86     {
87         int sx, sy, tx, ty;
88         cin >> sx >> sy >> tx >> ty;
89         
90         if(sx == tx && sy == ty)
91             cout << 0 << endl;
92         else
93             cout << bfs(sx, sy, tx, ty) << endl;
94     }
95     
96     return 0;
97 }
98 

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