题目描述
给定一个 n∗n 的棋盘,以及一个开始位置和终点位置。
将一个国际象棋中的骑士放置在开始位置上,请问将它移动至终点位置至少需要走多少步。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组测试数据第一行包含整数 n,表示棋盘大小。
第二行包含两个整数 x,y 用来表示骑士的开始位置坐标 (x,y)。
第三行包含两个整数 x,y 用来表示骑士的终点位置坐标 (x,y)。
输出格式
每组数据输出一个整数,表示骑士所需移动的最少步数,每个结果占一行。
数据范围
4≤n≤300,
0≤x,y≤n
输入样例
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
输入样例
5
28
0
思路:宽搜基础题,直接宽搜即可。
C++ 代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int vis[301][301],n,fx,fy;
const int dx[8]={2,1,-1,-2,-2,-1, 1, 2};
const int dy[8]={1,2,2 ,1, -1,-2,-2,-1};
void bfs(int x,int y)
{
queue<int> q1,q2;
q1.push(x);
q2.push(y);
while(!q1.empty())
{
int nowx=q1.front(),nowy=q2.front();
q1.pop();q2.pop();
if(nowx==fx and nowy==fy)
{
return;
}
else
{
for(int i=0;i<8;i++)
{
int tx=nowx+dx[i];
int ty=nowy+dy[i];
if(tx>=1 and tx<=n and ty>=1 and ty<=n and !vis[tx][ty])
{
vis[tx][ty]=vis[nowx][nowy]+1;
q1.push(tx);
q2.push(ty);
}
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
cin>>n;
n++;
int sx,sy;
cin>>sx>>sy;
cin>>fx>>fy;
sx++;sy++;fx++;fy++;
bfs(sx,sy);
cout<<vis[fx][fy]<<endl;
}
return 0;
}
而且我测试后面吧他xx=xx-dx[i]这样会内存会更优,不知道你有没有这样的测试
用pair更好吧哈哈