騎士旅行
time limit:1000ms memory limit:65536k
total submit:263 accepted:103
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"。
輸入檔案的第一行為兩個整數n與m,第二行為兩個整數i與j。
output
輸出檔案僅包含乙個整數為初始位置(1;1) 到格仔(i;j)最少移動次數。
sample input
5 31 2
sample output
3source
elba
vardx:array[1..8]of longint;
dy:array[1..8]of longint;
a:array[0..50+1,0..50+1] of longint;
father:array[1..50*50]of longint;
state:array[1..50*50,1..3] of longint;//3用於記錄步數(父節點數)
qx,qy,n,m,s:longint;
procedure init;
begin
readln(n,m);
read(qx,qy);
end;
procedure bfs;
varhead,tail,k,x,y:longint;
begin
head:=0;tail:=1;
state[1,1]:=1;state[1,2]:=1;state[1,3]:=0;
father[1]:=0;
repeat
inc(head);
for k:=1 to 8 do
begin
x:=state[head,1]+dx[k];
y:=state[head,2]+dy[k];
if (x>=1) and (x<=n) and (y>=1) and (y<=m) and (a[x,y]=0) then
begin
inc(tail);
father[tail]:=head;
state[tail,1]:=x;
state[tail,2]:=y;
a[x,y]:=1;
state[tail,3]:=state[head,3]+1;//統計步數
if (state[tail,1]=qx) and (state[tail,2]=qy) then
begin
s:=state[head,3]+1;//統計到達終點的步數
writeln(s);
halt;
tail:=0;//其實這條語句不必要,在執行它之前就當機了,不過出於是廣搜,暫且保留它吧
end;
end;
end;
until head>=tail;
end;
begin
dx[1]:=-1;dx[2]:=-2;dx[3]:=-2;dx[4]:=-1;dx[5]:=1;dx[6]:=2;dx[7]:=2;dx[8]:=1;//打表
dy[1]:=2;dy[2]:=1;dy[3]:=-1;dy[4]:=-2;dy[5]:=-2;dy[6]:=-1;dy[7]:=1;dy[8]:=2;
init;
bfs;
writeln('never');
end.
騎士旅行 ssl 1456
題意 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2 則騎士只能移入下面格仔 1 3 3 3 或 4 2 對於給定正整數n...
SSL 1456騎士旅行
time limit 1000ms memory limit 65536k 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2...
騎士旅行 BFS
description 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 如圖1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 如圖2 則騎士只能移入下面格仔 1 3 3 3 或 4 2...