ssl 1456
題目描述
在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 (1;1),騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。 例如, n=4,m=3 時,若騎士在格仔(2;1) , 則騎士只能移入下面格仔:(1;3),(3;3) 或 (4;2);對於給定正整數n,m,i,j值 (m,n<=50,i<=n,j<=m) ,你要測算出從初始位置(1;1) 到格仔(i;j)最少需要多少次移動。如果不可能到達目標位置,則輸出」never」。
題目解析
用廣搜(這不明擺著的麼)
解析圖(可能有點不連貫)廣搜原理:
原理即上,所以說用佇列儲存它的座標(1..2陣列)然後還要儲存它的步數(s[tail,步數所代表的數字]:=s[h,步數所代表的數字]+1)
難點在於:被坑,50*50算成250..
const
dx:array[1..8]of longint=(1,-1,1,-1,2,-2,2,-2);
dy:array[1..8]of longint=(2,-2,-2,2,1,-1,-1,1);
var n,m,ex,ey:longint;
a:array[1..50,1..50]of longint;
father:array[1..2500]of longint;
s:array[1..2500,1..3]of longint;
procedure
init;
begin
readln(n,m);
readln(ex,ey);
fillchar(a,sizeof(a),0);
end;
function
ping
(x,y:longint):boolean;
begin
if (x<=0)or(x>m)or(y<=0)or(y>n) then
exit(false);
if a[x,y]=1
then
exit(false);
exit(true);
end;
procedure
bfs;
var h,t,i:longint;
begin
h:=0;t:=1;father[1]:=0;
s[1,1]:=1;s[1,2]:=1;s[1,3]:=0;
repeat
inc(h);
for i:=1to8
doif ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
begin
inc(t);
father[t]:=h;
s[t,1]:=s[h,1]+dx[i];
s[t,2]:=s[h,2]+dy[i];
s[t,3]:=s[h,3]+1;
a[s[t,1],s[t,2]]:=1;
if (s[t,1]=ex)and(s[t,2]=ey) then
begin writeln(s[t,3]);halt; end;
end;
until h=t;
end;
begin
init;
bfs;
writeln('never');
end.
騎士旅行 BFS
description 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2 則騎士只能移入下面格仔 1 3 3 3 或 4 2...
騎士旅行 bfs
題目描述 description 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2 則騎士只能移入下面格仔 1 3 3 3 ...
騎士旅行(BFS)
description 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2 則騎士只能移入下面格仔 1 3 3 3 或 4 2...