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

2352

被折叠的 条评论
为什么被折叠?



