Knight Moves
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Knight Moves相关的知识,希望对你有一定的参考价值。
Knight Moves
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1257
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
输入n代表有个n*n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。
【输入】
首先输入一个n,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4<=L<=300);
第二行和第三行分别表示马的起始位置和目标位置(0~L-1)。
【输出】
马移动的最小步数,起始位置和目标位置相同时输出0。
【输入样例】
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
【输出样例】
5 28 0
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int n,qx,qy,ex,ey; int a[8][2]={{1,2},{-1,2},{-2,1},{2,1},{-1,-2},{1,-2},{-2,-1},{2,-1}}; int mp[305][305]; struct node { int x,y,step; node ():x(),y(),step(){} node (const int x,const int y,const int step):x(x),y(y),step(step){} }; void bfs() { queue <node>Q; Q.push(node(qx,qy,0)); mp[qx][qy]=-1; while(!Q.empty()) { node nw=Q.front(); Q.pop(); for(int i=0;i<8;i++) { int xn=nw.x+a[i][0],yy1=nw.y+a[i][1]; if(xn>=0&&xn<n&&yy1>=0&&yy1<n&&mp[xn][yy1]==0) { if(xn==ex&&yy1==ey) { printf("%d\n",nw.step+1); return ; } Q.push(node(xn,yy1,nw.step+1)); mp[xn][yy1]=-1; } } } cout<<"0"<<endl; } int main() { int t; cin>>t; while(t--) { cin>>n; cin>>qx>>qy>>ex>>ey; if(qx==ex&&qy==ey) { cout<<"0"<<endl;return 0; } memset(mp,0,sizeof(mp)); bfs(); } }
以上是关于Knight Moves的主要内容,如果未能解决你的问题,请参考以下文章