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的主要内容,如果未能解决你的问题,请参考以下文章

Knight Moves (双向bfs)

UVa439 Knight Moves(dfs)

poj1915 Knight Moves(BFS)

c++ Knight Moves 超级升级版

HDU 1372 Knight Moves(bfs)

习题6-4 骑士的移动(Knight Moves,UVa 439)