您的位置:首页 > 其它

poj 2243 Knight Moves

2012-09-02 09:13 295 查看
//这题和1915是一样的题目,只不过这题的输入需要进行转换,还有这题没有给出具体的棋盘和棋子的
//走法,如果对国际象棋不熟悉的人来讲,是很难读得明白题意的,棋盘和棋子的走法可以参照1915题!
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int MAX = 15;
map<char, int> m;
string input1, input2;
int l, r, sx, sy, ex, ey, dir[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {2, -1}, {2, 1}, {1, 2}};
bool vis[MAX][MAX];

//结构体储存一个点的坐标和到达这个点的步数!
struct Info{
int x, y;
int step;
}info[MAX*MAX];

//进行宽搜,得出另一个符合要求的坐标点,储存入数组,然后再一一进行搜索!
void solve(int x, int y)
{
if (x >= 0 && x < 8 && y >= 0 && y < 8 && !vis[x][y]){
info[r].x = x;
info[r].y = y;
info[r].step = info[l].step + 1;
vis[x][y] = 1;
r++;
}
}

void bfs()
{
int i, tmpx, tmpy;
info[0].x = sx;
info[0].y = sy;
vis[sx][sy] = 1;
l = 0;//以一个链表的形式进行搜索结果的储存!
r = 1;
while (l != r){
if (info[l].x == ex && info[l].y == ey){
//printf("To get from %s to %s takes %d knight moves.\n", input1, input2, info[l].step);
cout << "To get from " << input1 << " to " << input2 << " takes " << info[l].step << " knight moves." << endl;
break;
}
//八个方向的坐标转换,再一一进行宽搜!
for (i = 0; i < 8; i++){
tmpx = info[l].x + dir[i][0];
tmpy = info[l].y + dir[i][1];
solve(tmpx, tmpy);
}
l++;
}
return ;
}

int main()
{
m['a'] = 1, m['b'] = 2, m['c'] = 3, m['d'] = 4,
m['e'] = 5, m['f'] = 6, m['g'] = 7, m['h'] = 8;
while (cin >> input1 >> input2){
//对输入进行字符串和数字之间的转换!
sx = m[input1[0]] - 1;
sy = input1[1] - 48 - 1;
ex = m[input2[0]] - 1;
ey = input2[1] - 48 - 1;
memset(vis, 0, sizeof(vis));
bfs();
}

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: