棋盘中的马

题目描述

棋盘中有一个马,给出它的位置,它有一个目的地,请问它最少需要多少步才能走到它的目的地。马是走“日”字的
输入
输入:第一行两个整数: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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值