BFS(廣搜) 騎士旅行

2021-07-25 13:37:36 字數 2008 閱讀 4484

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...