原题链接传送门
———————————————————————————————————————————————
感谢
@ssl_lyf
@ssl_gjy
大佬的题解指点
———————————————————————————————————————————————
D e s c r i p t i o n Description Description
在一个n m 格子的棋盘上,有一只国际象棋的骑士在棋盘的左下角 (1;1)(如图1),骑士只能根据象棋的规则进行移动,要么横向跳动一格纵向跳动两格,要么纵向跳动一格横向跳动两格。 例如, n=4,m=3 时,若骑士在格子(2;1) (如图2), 则骑士只能移入下面格子:(1;3),(3;3) 或 (4;2);对于给定正整数n,m,I,j值 (m,n<=50,I<=n,j<=m) ,你要测算出从初始位置(1;1) 到格子(i;j)最少需要多少次移动。如果不可能到达目标
位置,则输出"NEVER"。
I
n
p
u
t
Input
Input
输入文件的第一行为两个整数n与m,第二行为两个整数i与j。
O u t p u t Output Output
输出文件仅包含一个整数为初始位置(1;1) 到格子(i;j)最少移动次数。
S a m p l e I n p u t Sample Input SampleInput
5 3
1 2
S a m p l e O u t p u t Sample Output SampleOutput
3
———————————————————————————————————————————————
也是一道广搜板子题
和电子老鼠闯迷宫类似。
注意:
1.方向数组里有八个方向。
2.注意输出顺序(就是输出答案和NEVER的顺序)我被坑惨了
3.数组别开小了 。
核心代码:
while(head<=tail)
{
head++;
for(int i=0; i<8; i++) //八个方向
{
if(check(st[head][1]+dx[i],st[head][2]+dy[i])==1)
{
tail++;
fa[tail]=head;
st[tail][1]=st[head][1]+dx[i];
st[tail][2]=st[head][2]+dy[i];
a[st[head][1]+dx[i]][st[head][2]+dy[i]]=1;
st[tail][3]=st[head][3]+1;
if(st[head][1]+dx[i]==cx&&st[head][2]+dy[i]==cy)
{
ans=st[tail][3];
cout<<ans;
return;
}
}
}
}