nenuoj 1364-移动的骑士

本文介绍了一种通过广度优先搜索(BFS)算法解决国际象棋中骑士从一个位置移动到另一个位置所需最少步数的问题。算法使用结构体记录路径,并通过判断当前位置是否为合法位置来更新状态。

移动的骑士

Time Limit:1000MS  Memory Limit:65536K
Total Submit:263 Accepted:163

Description

Somurolov先生是一个国际象棋高手,他声称在棋盘上将骑士棋子从一点移动到另外一点,没有人比他快,你敢挑战他吗? 
你的任务是编程计算出将一个骑士棋子从一点移动到另外一点,最少需要移动的步数。显而易见,这样你就有赢得Somurolov先生的机会。国际象棋中的骑士在棋盘上可移动的范围如下图: 
 

Input

首先输入测试样例的个数n。接下来是n组输入数据,每组测试数据由三行整数组成:第一行是棋盘的边长l (4 <= l <= 300),整个棋盘的面积也就是 l*l;第二行和第三行分别是骑士棋子的初始位置和目标位置,表示为整数对形式{0, …, l-1}*{0, …, l-1}。保证棋子的初始和目标位置是棋盘上的合法位置。

Output

对于每一个输入的测试样例,请你算出骑士从初始位置移动到目标位置最小移动步数。如果初始位置和目标位置相同,那么骑士移动的距离就是0。最后单独一行输出所求距离。

Sample Input

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

Sample Output

5
28
0

题解:简单的BFS

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
bool vis[300][300];
int rowMove[]={-2,-1,1,2,2,1,-1,2};
int lineMove[]={1,2,2,1,-1,-2,-2,-1};
bool judge;
int mmp=0;
struct node
{
    int pre;
    int x;
    int y;
}path[10000];
void BFS(int l,int x1,int y1,int x2,int y2)
{
    int frontt=0;
    int rear=1;
    path[0].x=x1;
    path[0].y=y1;
    path[0].pre=-1;
    while(frontt<rear)
    {
        for(int i=0;i<8;++i)
        {
            int a=path[frontt].x+rowMove[i];
            int b=path[frontt].y+lineMove[i];
            if(a<0||a>=l||b<0||b>=l||vis[a][b])
                continue;
            vis[a][b]=1;
            path[rear].x=a;
            path[rear].y=b;
            path[rear].pre=frontt;
            if(a==x2&&b==y2)
            {
                int sum=0;
                while(path[rear].pre!=-1)
                {
                    rear=path[rear].pre;
                    sum++;
                }
                mmp=sum;
                return;
            }
            rear++;
        }
        frontt++;
    }
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        judge=0;
        memset(vis,0,sizeof(vis));
        int l,x1,y1,x2,y2;
        cin>>l>>x1>>y1>>x2>>y2;
        if(x1==x2&&y1==y2)
        {
            cout<<"0"<<endl;
            continue;
        }
        BFS(l,x1,y1,x2,y2);
        cout<<mmp<<endl;
    }
    return 0;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值