1257:Knight Moves
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 7882 通过数: 4036
【题目描述】
输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。
【输入】
首先输入一个nn,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300)L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0..L−1)(0..L−1)。
【输出】
马移动的最小步数,起始位置和目标位置相同时输出00。
【输入样例】
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
【输出样例】
5
28
0
#include <bits/stdc++.h>//Writed by Wangzhimin.Date:2022.4.29
int r,c;
int visited[305][305];
struct step1{
int x;
int y;
int step;
step1(int xx,int yy,int s):x(xx),y(yy),step(s){
};
};
using namespace std;
int visit2[105];
int num=0;
int main()
{
int k,i,j,n;
int r1,c1,r2,c2;
scanf("%d",&n);
for(num=0;num<n;num++){
scanf("%d",&r);
queue <step1> q;
memset(visited,0,sizeof(visited));
scanf("%d%d",&r1,&c1);
scanf("%d%d",&r2,&c2);
q.push(step1(r1,c1,0));
visited[r1][c1]=1;
while(!q.empty()){
step1 s=q.front();
//cout<<s.x<<s.y<<s.step<<endl;
if(s.x==r2&&s.y==c2){
visit2[num]=s.step;
break;
}
else{
if(s.x-1>=0&&s.y+2<r&&visited[s.x-1][s.y+2]!=1){//下移右移
q.push(step1(s.x-1,s.y+2,s.step+1));
visited[s.x-1][s.y+2]=1;
}
if(s.x+1<r&&s.y+2<r&&visited[s.x+1][s.y+2]!=1){//上移右移
q.push(step1(s.x+1,s.y+2,s.step+1));
visited[s.x+1][s.y+2]=1;
}
if(s.y+1<r&&s.x+2<r&&visited[s.x+2][s.y+1]!=1){//右移上移
q.push(step1(s.x+2,s.y+1,s.step+1));
visited[s.x+2][s.y+1]=1;
}
if(s.y-1>=0&&s.x+2<r&&visited[s.x+2][s.y-1]!=1){//左移上移
q.push(step1(s.x+2,s.y-1,s.step+1));
visited[s.x+2][s.y-1]=1;
}
if(s.x-1>=0&&s.y-2>=0&&visited[s.x-1][s.y-2]!=1){//前移左移
q.push(step1(s.x-1,s.y-2,s.step+1));
visited[s.x-1][s.y-2]=1;
}
if(s.x+1<r&&s.y-2>=0&&visited[s.x+1][s.y-2]!=1)//后移左移
{
q.push(step1(s.x+1,s.y-2,s.step+1));
visited[s.x+1][s.y-2]=1;
}
if(s.y+1<r&&s.x-2>=0&&visited[s.x-2][s.y+1]!=1){//右移上移
q.push(step1(s.x-2,s.y+1,s.step+1));
visited[s.x-2][s.y+1]=1;
}
if(s.y-1>=0&&s.x-2>=0&&visited[s.x-2][s.y-1]!=1){//左移上移
q.push(step1(s.x-2,s.y-1,s.step+1));
visited[s.x-2][s.y-1]=1;
}
q.pop();
}
}
}
for(i=0;i<num;i++)
cout<<visit2[i]<<endl;
return 0;
}