棋盤中的馬
棋盤中有一個馬,給出它的位置,它有一個目的地,請問它最少需要多少步才能走到它的目的地。
輸入
•輸入:第一行兩個整數:n,m,(n<=1000,m<=1000)表示棋盤有n行m列。第一行第一列爲(1,1).
•第二行:x1,y1,表示馬的位置。
•第三行:x2,y2,表示它的目的地。
•保證起始和終止位置都在棋盤內。
如果馬不能到達目的地,輸出-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}};
bool book[1005][1005],flag;
int main()
{
int n,m,x1,y1,x2,y2,xx,yy,head,tail;
head=tail=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++;
book[x1][y1]=1;
while(head<tail)
{
for(int i=0;i<8;i++)
{
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++;
}
if(xx==x2&&yy==y2){flag=1;break;}
}
if(flag==1)break;
head++;
}
if(flag==0)printf("-1");
else printf("%d",ques[tail-1]);
return 0;
}