ZOJ 1091题解 此题不难只要想清楚国际象棋中的马的“日”子走法便可清楚,再加上BFS与队列的运用,另外有些细节需注意,详见代码

  1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<queue>
5
6 using namespace std;
7
8 queue<int>q;
9 int main()
10 {
11 int a, x, b, y;
12 int visit[9][9];
13 char c1, c2, r1, r2;
14
15 while(cin>>c1>>r1>>c2>>r2)
16 {
17 memset(visit, 0, sizeof(visit));
18 b = c1 - 'a'+1;
19 a = r1-'0';
20 x = c2 - 'a'+1;
21 y = r2-'0';
22 visit[a][b] = 1; //给起始位置标记,以后就不再走了
23 q.push(a);
24 q.push(b);
25 while(!q.empty())//判段队列是否为非空
26 {
27 a = q.front();
28 q.pop();
29 b = q.front();
30 q.pop();
31 if(a==y && b==x)//循环终止的条件,到达指定位置。
32 break;
33 if (a+1 <= 8)//以下是按照8个方向来走的,这里表示的还不够清楚,以后再优化吧。
34 {
35 if (visit[a+1][b+2]==0 && b+2<=8)
36 {
37 visit[a+1][b+2] = 1+visit[a][b];
38 q.push(a+1);
39 q.push(b+2);
40 }
41 if (visit[a+1][b-2]==0 && b-2>=1)
42 {
43 visit[a+1][b-2] = 1+visit[a][b];
44 q.push(a+1);
45 q.push(b-2);
46 }
47 }
48
49 if (a-1 >= 1)
50 {
51 if (visit[a-1][b+2]==0 && b+2<=8)
52 {
53 visit[a-1][b+2] = 1+visit[a][b];
54 q.push(a-1);
55 q.push(b+2);
56 }
57 if (visit[a-1][b-2]==0 && b-2>=1)
58 {
59 visit[a-1][b-2] = 1+visit[a][b];
60 q.push(a-1);
61 q.push(b-2);
62 }
63 }
64
65 if (a+2 <= 8)
66 {
67 if (visit[a+2][b+1]==0 && b+1<=8)
68 {
69 visit[a+2][b+1] = 1+visit[a][b];
70 q.push(a+2);
71 q.push(b+1);
72 }
73 if (visit[a+2][b-1]==0 && b-1>=1)
74 {
75 visit[a+2][b-1] = 1+visit[a][b];
76 q.push(a+2);
77 q.push(b-1);
78 }
79 }
80
81 if (a-2 >= 1)
82 {
83 if (visit[a-2][b+1]==0 && b+1<=8)
84 {
85 visit[a-2][b+1] = 1+visit[a][b];
86 q.push(a-2);
87 q.push(b+1);
88 }
89 if (visit[a-2][b-1]==0 && b-1>=1)
90 {
91 visit[a-2][b-1] = 1+visit[a][b];
92 q.push(a-2);
93 q.push(b-1);
94 }
95 }
96 }
97 printf("To get from %c%c to %c%c takes %d knight moves.\n",c1,r1,c2,r2,visit[a][b]-1);
98 getchar(); //这里的换行符不可省略,这里容易出错。
99 }
100 return 0;
101 }
102
103

  

posted @ 2011-08-29 22:47  zhongya  阅读(358)  评论(0编辑  收藏  举报