题目描述
输出:马走到目的地所需的最少步数
样例输入
3 5
2 5
1 1
样例输出
3
代码如下
#include<cstdio>
int quex[1000005],quey[1000005],ques[1000005];
int dr[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
//dr是方向数组,quex,quey,ques是队列数组(可以用结构体),ques是扩展的层数
bool book[1005][1005],flag;
//book标记走过的点,flag用来判断是否找到,和退出循环
int main()
{
int n,m,x1,y1,x2,y2,xx,yy,head,tail;
head=tail=1;
//队头和队尾出始值为1
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
quex[tail]=x1;
quey[tail]=y1;
ques[tail]=0;
tail++;
//把起点坐标入队,tail指向队尾后一个元素
book[x1][y1]=1;
//标记起点
while(head<tail)
//当队头与对尾指向同一个位置时退出循环
{
for(int i=0;i<8;i++)
//枚举8个方向
{
xx=quex[head]+dr[i][0];
yy=quey[head]+dr[i][1];
if(xx>0&&yy>0&&xx<=n&&yy<=m&&book[xx][yy]==0)
{
book[xx][yy]=1;
//标记走过的点
quex[tail]=xx;
quey[tail]=yy;
ques[tail]=ques[head]+1;
tail++;
//将现在的坐标入队,并且tail指向队尾的后一个元素,层数是待扩展节点的层数+1
}
if(xx==x2&&yy==y2){flag=1;break;}
//当马到达终点,退出循环
}
if(flag==1)break;
//如果找到了,退出循环
head++;
//扩展结束,再换下一个扩展
}
if(flag==0)printf("-1");
else printf("%d",ques[tail-1]);
//flag=0时,没有找到,因为tail指向的始终是队尾的后一个元素,所以减1
return 0;
}