题目
PIPI现在有一个8*8的棋盘,他想让骑士棋子在8*8的棋盘上移动,骑士和中国象棋中的"马"移动规则相同,都是往8个方向走"日"字型。的1-8代表行号,a-h代表列号,给出骑士的初始位置和目的位置,求骑士从初始位置到目的位置最少的移动步数。
输入
输入包含多组测试用例。
对于每一组测试用例,输入两个字符串,分别代表骑士的初始位置和目的位置。
输出
样例输出:
To get from e2 to e4 takes 2 knight moves.
很简单的迷宫问题,就是方向数组的值不同。
#include <bits/stdc++.h>
using namespace std;
bool vis[9][9];
struct Node{
int x,y;
int path;
};
int dir[8][2]={2,1,2,-1,-2,-1,-2,1,1,2,1,-2,-1,-2,-1,2};
char s[4],e[4];
int sx,xy,ex,ey;
bool check(int x,int y){
if(x<=0||x>8||y<=0||y>8||vis[x][y])
return false;
else
return true;
}
int bfs(int sx,int sy,int ex,int ey){
memset(vis,0,sizeof(vis));
queue<Node> q;
q.push({sx,sy,0});
vis[sx][sy]=1;
while(q.size()){
Node now=q.front();
q.pop();
if(now.x==ex&&now.y==ey){//已经到达终点
return now.path;
}
for(int i=0;i<8;i++){
int xx=now.x+dir[i][0];
int yy=now.y+dir[i][1];
if(check(xx,yy)){
q.push({xx,yy,now.path+1});
vis[xx][yy]=1;
}
}
}
}
int main(int argc, char** argv) {
while(scanf("%s\0",s)!=EOF){
scanf("%s",e);
int sx=s[0]-'a'+1,sy=s[1]-'0';
int ex=e[0]-'a'+1,ey=e[1]-'0';
int path=bfs(sx,sy,ex,ey);
printf("To get from %s to %s takes %d knight moves.\n",s,e,path);
}
return 0;
}