首页 > 代码库 > 最少步数x
最少步数x
【输入样例】
18 10
【输出样例】
9
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int s[101][101],que[10000][4]= {0},xa,ya,xb,yb;
int dx[12]= {-2,-2,-1,1,2,2,2,2,1,-1,-2,-2},
dy[12]= {-1,-2,-2,-2,-2,-1,1,2,2,2,2,1}; //分别为走日与走田的方法
int main() {
scanf("%d %d\n",&xa,&ya);
scanf("%d %d\n",&xb,&yb);
memset(s,0xff,sizeof(s));
int head=1,tail=1; //初始位置入队
que[1][1]=1;
que[1][2]=1;
que[1][3]=0;
while(head<=tail) { //若队列非空,则扩展队首结点
for(int d=0; d<=11; d++) { //枚举12个扩展方向
int x=que[head][1]+dx[d]; //计算马按d方向跳跃后的位置
int y=que[head][2]+dy[d];
if(x>0&&y>0)
if(s[x][y]==-1) { //若(x,y)满足约束条件
s[x][y]=que[head][3]+1; //计算(1,1)到(x,y)的最少步数
tail++; //(1,1)至(x,y)的最少步数入队
que[tail][1]=x;
que[tail][2]=y;
que[tail][3]=s[x][y];
if(s[xa][ya]>0&&s[xb][yb]>0) { //输出问题的解
cout<<s[xa][ya]<<endl;
cout<<s[xb][yb]<<endl;
return 0;
}
}
}
head++;
}
return 0;
}
最少步数x