直接暴力递归 真香 遍历可以走的八个方向,且用搜索算法,套用的数组记录的方式+回溯+剪枝,朴实无华。
#include<iostream>
using namespace std;
int arr[9][9],flag=1000000007;
void func(int a,int b,int c,int d,int num){
if(num>=flag){return;}
if(a==c&&b==d){
flag=num<flag ? num:flag;
}
if(a+1<=8&&b+2<=8&&a+1>=0&&b+2>=0&&arr[a+1][b+2]==0){
arr[a+1][b+2]=1;
func(a+1,b+2,c,d,num+1);
arr[a+1][b+2]=0;
}
if(a+2<=8&&b+1<=8&&a+2>=0&&b+1>=0&&arr[a+2][b+1]==0){
arr[a+2][b+1]=1;
func(a+2,b+1,c,d,num+1);
arr[a+2][b+1]=0;
}
if(a+2<=8&&b-1<=8&&a+2>=0&&b-1>=0&&arr[a+2][b-1]==0){
arr[a+2][b-1]=1;
func(a+2,b-1,c,d,num+1);
arr[a+2][b-1]=0;
}
if(a+1<=8&&b-2<=8&&a+1>=0&&b-2>=0&&arr[a+1][b-2]==0){
arr[a+1][b-2]=1;
func(a+1,b-2,c,d,num+1);
arr[a+1][b-2]=0;
}
if(a-1<=8&&b-2<=8&&a-1>=0&&b-2>=0&&arr[a-1][b-2]==0){
arr[a-1][b-2]=1;
func(a-1,b-2,c,d,num+1);
arr[a-1][b-2]=0;
}
if(a-2<=8&&b-1<=8&&a-2>=0&&b-1>=0&&arr[a-2][b-1]==0){
arr[a-2][b-1]=1;
func(a-2,b-1,c,d,num+1);
arr[a-2][b-1]=0;
}
if(a-2<=8&&b+1<=8&&a-2>=0&&b+1>=0&&arr[a-2][b+1]==0){
arr[a-2][b+1]=1;
func(a-2,b+1,c,d,num+1);
arr[a-2][b+1]=0;
}
if(a-1<=8&&b+2<=8&&a-1>=0&&b+2>=0&&arr[a-1][b+2]==0){
arr[a-1][b+2]=1;
func(a-1,b+2,c,d,num+1);
arr[a-1][b+2]=0;
}
return;
}
int main(){
int a,b,c,d;
cin>>a>>b>>c>>d;
func(a,b,c,d,0);
cout<<flag<<endl;
}