BFS大法好!!!
首先是确定12个走向
x[20]={-2,-2,-1,1,2,2,1,-1,2,2,-2,-2};
y[20]={-1,1,2,2,1,-1,-2,-2,2,-2,2,-2};
用一个二维BOOL数组去重,用两个数组分别表示棋盘X轴和Y轴。。
注意边界是50 * 50
和 1 * 1
然后就愉快的开始搜索
#include<bits/stdc++.h>
using namespace std;
int x[20]={-2,-2,-1,1,2,2,1,-1,2,2,-2,-2};
int y[20]={-1,1,2,2,1,-1,-2,-2,2,-2,2,-2};//定义走向
int a[3][625000];//X轴数组和Y轴数组,还有一个是步数
bool k[51][51];//判去重
int t,z,head,tail;
void write()
{
cout<<a[0][head]<<endl;
}
void work()
{
int i,j,l,m,n;
head=1;tail=1;
for (i=1;i<=50;i++)
for (j=1;j<=50;j++)
k[i][j]=0;
memset(a[1],0,sizeof(a[1]));
memset(a[2],0,sizeof(a[2]));
memset(a[0],0,sizeof(a[0]));//记得全部清零!
a[1][1]=t;a[2][1]=z;//划定初始位置
while (a[1][head]!=1||a[2][head]!=1)
{
for (i=0;i<=11;i++)
{
l=a[1][head]+x[i];m=a[2][head]+y[i];
if (l<=50&&l>=1&&m<=50&&m>=1&&k[l][m]==0)//边界
{
a[1][++tail]=l;
a[2][tail]=m;
k[l][m]=1;
a[0][tail]=a[0][head]+1;//核心移动部分
}
}
head++;
}
write();
}
void read()
{
cin>>t>>z;work();
cin>>t>>z;work();//两种棋子分别搜一次(蒟蒻不会只用一次搜索)
}
int main()
{
read();
return 0;//好看的主程序
}