一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
输入格式
一行四个数字a,b,c,d。
输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
样例输入
1 1 2 3
样例输出
1
数据规模和约定
0<a,b,c,d≤8且都是整数。
思路
利用dfs进行八个方向的搜索,当遇到结果将当前第一次到达的次数给结果cnt.因为dfs可能绕圈圈做重复的步,所以可能会多次返回,所以设置了min函数只留下没有绕圈的那次的次数.
第一次写,只是新手记录, @-@
#include<bits/stdc++.h>
using namespace std;
int cnt;
int a,b,c,d;
void dfs(int x,int y,int ci)
{ if(x>8||y>8||x<1||y<1)
{
return;
}//到达边界时退出
if(ci>8)return;//当绕圈绕多了就退出它
if(x==a&&y==b)
{ if(cnt==0)cnt=ci;
else
cnt=min(cnt,ci);
return;
}
dfs(x-2,y+1,ci+1);
dfs(x-1,y+2,ci+1);
dfs(x+2,y+1,ci+1);
dfs(x+1,y+2,ci+1);
dfs(x+1,y-2,ci+1);
dfs(x+2,y-1,ci+1);
dfs(x-1,y-2,ci+1);
dfs(x-2,y-1,ci+1);
return;
}
int main()
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a==c&&b==d){
printf("%d",0);
return 0;
}//当起点和终点相同,直接输入,这是边界判断
dfs(c,d,0);
if(cnt==0)printf("%d",-1);
else
printf("%d",cnt);
return 0;
}