题目:
在象棋王国,尼古拉斯.火山是一匹英俊的马,他非常幸运迎娶了白马王国的公主,他们将度蜜月,你现在是他们的女仆,火山会问你去一些地方最少需要多少步,这么简单的事当然难不倒你。由于火山是一匹马,他的移动方式将会遵守国际象棋马的走法。
输入:
输入包含一个或多个输入样例。每个测试样例将会有两个坐标,表示现在的位置和将要到达的地方,每个坐标包含一个字母(a-h)表示列和一个数字(1-8) 行,这意味这这个象棋王国是一个8* 8的矩形。
Input
输入包含一个或多个输入样例。每个测试样例将会有两个坐标,表示现在的位置和将要到达的地方,每个坐标包含一个字母(a-h)表示列和一个数字(1-8) 行,这意味这这个象棋王国是一个8* 8的矩形。
Output
每一组样例将会输出一段话 “To get from xx to yy takes n knight moves.”,其中xx表示起点,yy表示终点,n为xx到yy的最短步数。
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample 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 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.
分析与解答
基础bfs,主要是知道那个马是怎么走的,就是每次是需要怎么走,然后列和行转换成数字就行
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int step;
int dir[8][2]={{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}};
int map[10][10],ex,ey;
char s1[5],s2[5];
struct node
{ int x,y,step;
}; int bfs()
{ int i; memset(map,0,sizeof(map)); //标记数组 node st,ed; //队首 st.x = s1[0]-'a'; st.y = s1[1]-'1'; st.step = 0; ex = s2[0]-'a' ; //终点坐标 ey = s2[1]-'1'; queue<node> q;map[st.x][st.y] = 1; q.push(st); while(!q.empty()) { st = q.front(); q.pop(); if(st.x == ex && st.y == ey)//队首元素等于终点的话直接返回 {return st.step; } for(i = 0; i<8; i++) //变换八个位置 { ed.x = st.x+dir[i][0]; ed.y = st.y+dir[i][1]; if (ed.x>=0&&ed.x<8&&ed.y>=0&&ed.y<8&&map[ed.x][ed.y]==0) //没走过而且在棋盘内 { ed.step=st.step+1; map[ed.x][ed.y]=1; q.push(ed); } } } return 0;
} int main()
{ while(~scanf("%s%s",s1,s2)) //s1跑到s2 { printf("To get from %s to %s takes %d knight moves.\n",s1,s2,bfs()); } return 0;
}