"马走日"问题,BFS解决,比较简单,状态即为当前所在的位置,代码如下:

Code
1
#include <iostream>
2
#include <string>
3
#include <queue>
4
using namespace std;
5
6
const int CHESS_SIZE = 8;
7
8
struct Position
9

{
10
Position(int x, int y)
11
: X(x), Y(y)
12
{}
13
int X;
14
int Y;
15
16
bool operator==(const Position & position) const
17
{
18
return X == position.X && Y == position.Y;
19
}
20
};
21
22
struct
23

{
24
int x;
25
int y;
26
}dir[8] =
27

{
28
{-2, 1},
{-1, 2},
{1, 2},
{2, 1},
29
{2, -1},
{1, -2},
{-1, -2},
{-2, -1}
30
};
31
32
bool IsInside(const int x, const int y)
33

{
34
return x >= 0 && x < CHESS_SIZE && y >= 0 && y < CHESS_SIZE;
35
}
36
37
int _tmain(int argc, _TCHAR* argv[])
38

{
39
string start, end;
40
while(cin >> start >> end)
41
{
42
int chess_count[CHESS_SIZE][CHESS_SIZE] =
{-1};
43
bool chess_status[CHESS_SIZE][CHESS_SIZE] =
{false};
44
45
int start_col = (int)(start[0] - 'a');
46
int start_row = (int)(start[1] - '0' - 1);
47
int end_col = (int)(end[0] - 'a');
48
int end_row = (int)(end[1] - '0' - 1);
49
50
queue<Position> q;
51
q.push(Position(start_row, start_col));
52
Position goal(end_row, end_col);
53
chess_status[start_row][start_col] = true;
54
chess_count[start_row][start_col] = 0;
55
56
Position current_state(0,0), next_state(0,0);
57
58
// if the start is equal to goal
59
if(q.front() == goal)
60
{
61
cout << "To get from " << start << " to " << end << " takes 0 knight moves." << endl;
62
continue;
63
}
64
65
bool isFind = false;
66
Position new_position(0, 0);
67
68
while(!q.empty())
69
{
70
current_state = q.front();
71
q.pop();
72
73
for(int i = 0; i < 8; ++i)
74
{
75
int x = current_state.X + dir[i].x;
76
int y = current_state.Y + dir[i].y;
77
new_position.X = x;
78
new_position.Y = y;
79
80
// for performance concern, when we found the solution, break it,
81
// otherwise it will wait until all pre-solutions are being handled
82
if(new_position == goal)
83
{
84
isFind = true;
85
break;
86
}
87
88
if(IsInside(x, y) && !chess_status[x][y])
89
{
90
q.push(Position(x, y));
91
chess_status[x][y] = true;
92
chess_count[x][y] = chess_count[current_state.X][current_state.Y] + 1;
93
}
94
}
95
if(isFind)
96
break;
97
}
98
99
cout << "To get from " << start << " to " << end <<
100
" takes " << chess_count[current_state.X][current_state.Y] + 1 << " knight moves." << endl;
101
}
102
return 0;
103
}
104
105
posted on 2009-03-26 21:17
肖羽思 阅读(1330)
评论(1) 编辑 收藏 引用 所属分类:
ZOJ