【NEEPU OJ】3004--马走日

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_34072526/article/details/88370213