您的位置:首页 > 其它

【NEEPU OJ】3004--马走日

2019-03-09 19:29 190 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34072526/article/details/88370213

描述

在象棋王国,尼古拉斯.火山是一匹英俊的马,他非常幸运迎娶了白马王国的公主,他们将度蜜月,你现在是他们的女仆,火山会问你去一些地方最少需要多少步,这么简单的事当然难不倒你。由于火山是一匹马,他的移动方式将会遵守国际象棋马的走法。

输入

输入包含一个或多个输入样例。每个测试样例将会有两个坐标,表示现在的位置和将要到达的地方,每个坐标包含一个字母(a-h)表示列和一个数字(1-8) 行,这意味这这个象棋王国是一个8*8的矩形。

输出

每一组样例将会输出一段话 “To get from xx to yy takes n knight moves.”,其中xx表示起点,yy表示终点,n为xx到yy的最短步数。

输入样例 1

e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6

输出样例 1

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 a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.

代码

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int dx[] = {-2, 2, -2, 2, 1, 1, -1, -1};
const int dy[] = {1, 1, -1, -1, -2, 2, -2, 2};
int vis[10][10];

struct node{
int x, y;
}start, over;

int bfs(){
if(start.y == over.y && start.x == over.x) return 0;
memset(vis, 0, sizeof(vis));
queue<node> q;
int i;
q.push(start);
while(!q.empty()){
node t1 = q.front();
q.pop();
for(i = 0; i < 8; i++){
node t2;
t2.x = t1.x + dx[i];
t2.y = t1.y + dy[i];
if(t2.x >= 1 && t2.x <= 8 && t2.y >= 1 && t2.y <= 8 && !vis[t2.y][t2.x]){
vis[t2.y][t2.x] = vis[t1.y][t1.x] + 1;
if(t2.y == over.y && t2.x == over.x) return vis[t2.y][t2.x];
q.push(t2);
}
}
}
return -1;
}

int main(){
char sy, oy;
while(~scanf("%c%d %c%d%*c", &sy, &start.x, &oy, &over.x)){
start.y = sy - 96;
over.y = oy - 96;
printf("To get from %c%d to %c%d takes %d knight moves.\n", sy, start.x, oy, over.x, bfs());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: