棋盘中的马

xiaoxiao2021-02-28  115

题目描述

棋盘中有一个马,给出它的位置,它有一个目的地,请问它最少需要多少步才能走到它的目的地。马是走“日”字的 输入 输入:第一行两个整数:n,m,(n<=1000,m<=1000)表示棋盘有nm列。第一行第一列为(1,1). 第二行:x1y1,表示马的位置。 第三行:x2y2,表示它的目的地。 保证起始和终止位置都在棋盘内。 如果马不能到达目的地,输出-1. 输出

输出:马走到目的地所需的最少步数

样例输入

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;

}

转载请注明原文地址: https://www.6miu.com/read-77347.html

最新回复(0)