您的位置:首页 > 其它

骑士的移动

2015-07-25 08:46 351 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E

题意:

输入标准8*8国际象棋棋盘上的两个格子(列用a~h表示,行用1~8表示),求马最少需要多少步从起点跳到终点。(可输入多组案例)

input:

e2 e4

a1 b2

b2 c3

f6 f6

output:

To get from e2 to e4 takes 2 knight moves.

To get from a1 to b2 takes 4 knight moves.

To get from b2 to c3 takes 2 knight moves.

To get from f6 to f6 takes 0 knight moves.

思路分析:

求的是最短路,可以用BFS。

要先把马会走的8个方向记为一个坐标变化的二维数组,a~h转化为1~8,设立一个二维数组记录马所到过的坐标。

注意:马不能离开棋盘,马不能再次到达它所到过的地方。

再利用BFS求最短路。

源代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int s[8][2]={{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}};     //八个方向
int ch[10][10];
struct node
{
int x,y,count;
}a,b;
int main()
{

char c1,c2;
int r1,r2,c3,c4;
while(cin>>c1>>r1>>c2>>r2)
{
c3=c1-'a'+1;
c4=c2-'a'+1;
memset(ch, 0, sizeof(ch));    //地图清零,以便记录马是否到过
ch[c3][r1]=1;
b.x=c3;b.y=r1;b.count=0;
queue<node> d;
d.push(b);
while(!d.empty())           //BFS
{
a=d.front();
d.pop();
if(a.x==c4&&a.y==r2)break;
for(int i=0;i<8;i++)
{
b.x=a.x+s[i][0];
b.y=a.y+s[i][1];
if(b.x<1||b.x>8||b.y<1||b.y>8)continue;
if(ch[b.x][b.y]==1)continue;
ch[b.x][b.y]=1;
b.count=a.count+1;
d.push(b);
}
}
printf("To get from %c%d to %c%d takes %d knight moves.\n",c1,r1,c2,r2,a.count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: