八數碼難題

2022-05-14 06:12:58 字數 3752 閱讀 9061

yours和zero在研究a*啟發式演算法.拿到一道經典的a*問題,但是他們不會做,請你幫他們.

問題描述

在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局(為了使題目簡單,設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。

輸入描述 input description

輸入初試狀態,一行九個數字,空格用0表示

輸出描述 output description

只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)

樣例輸入 sample input

樣例輸出 sample output

資料範圍及提示 data size & hint

詳見試題

由題意得(討厭這句話),這是一道搜尋題,由於是找最少移動次數,所以應該是用廣度優先搜尋,為了節約時間,採用雙向寬度優先搜尋。當然,這是我第一次寫雙向寬搜,

應該有優化,但我並不知道怎麼寫,話說還有乙個叫a*的演算法……不造如何做!!!

1

program

eigntnumber;

2const f1:array[1..3,1..3] of longint=((1,2,3

),3 (8,0,4

),4 (7,6,5

));5

type zz=array[1..3,1..3] of

longint;

6const fx:array[1..4] of longint=(1,-1,0,0

);7 fy:array[1..4] of longint=(0,0 ,1, -1);8

var b:array[1..2,1..100000] of

zz;9 t,h:array[1..2] of

longint;

10 pace:array[1..2,1..100000] of

longint;

11i,j:longint;

12ch:char;

13f:zz;

14function

pd(h,l:longint):boolean;

15begin

16if h>3

then

exit(false);

17if h<=0

then

exit(false);

18if l>3

then

exit(false);

19if l<=0

then

exit(false);

20exit(true);

21end;22

23function

check(z:zz; a:longint):longint;

24var

i:longint;

25begin

26if a=2

then a:=1

else a:=2;27

for i:=1

to t[a] do

28if comparedword(b[a,i],z,9)=0

then

exit(pace[a,i]);

29 exit(0

);30

end;

3132

33function kg(z:zz; a:longint):boolean;//應該有優化,但是我不會寫

34var

i:longint;

35begin

36for i:=1

to t[a] do

37if comparedword(b[a,i],z,9)=0

then

exit(false);

38exit(true);

39end;40

41procedure

expend(a:longint);

42var

i,j,x,y:longint;

43z:zz;

4445

begin

46inc(h[a]);

47for i:=1to3

do48

for j:=1to3

do49

if b[a][h[a]][i][j]=0

then

50begin

51 x:=i;

52 y:=j;

53break;

54end;55

for i:=1to4

do56

if pd(x+fx[i],y+fy[i]) then

57begin

58 z:=b[a,h[a]];

59 z[x,y]:=z[x+fx[i],y+fy[i]];

60 z[x+fx[i],y+fy[i]]:=0;61

if check(z,a)<>0

then

62begin

63 writeln(check(z,a)+pace[a,h[a]]+1

);64

halt;

65end;66

if kg(z,a) then

67begin

68inc(t[a]);

69 b[a,t[a]]:=z;

70 pace[a,t[a]]:=pace[a,h[a]]+1;71

end;

72end;73

end;

7475

begin

76for i:=1to3

do77

for j:=1to3

do78

begin

79read(ch);

80 f[i,j]:=ord(ch)-48;81

end;

8283 b[1,1]:=f;

84 b[2,1]:=f1;

85 t[1]:=1

;86 t[2]:=1;87

while (h[1]<=t[1]) or (h[2]<=t[2]) do

88begin

89if (t[1]<=t[2]) and (h[1]<=t[1])then

90begin

91 expend(1

);92

continue;

93end;94

if (t[1]>=t[2]) and (h[2]<=t[2]) then

95begin

96 expend(2

);97

continue;

98end;99

if h[1]<=t[1] then

100 expend(1

);101

if h[2]<=t[2] then

102 expend(2

);103

end;

104end.

八數碼難題

今天做了一道八數碼,完全沒有bfs的思路,還是請大佬點通了以下,才知道這跟bfs沒有什麼區別 之所以要把難題劃掉,是因為發現這根本是一道水題,對,沒錯,沒有你想的那麼難 首先給你的乙個數,就是八數碼的排列,也就是 0 sim8 的全排列,然後你需要搜尋他怎樣移動。然後我們需要判重了,判重的方法有很多...

八數碼難題

在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布局 初始狀態 和目標布局 為了使題目簡單,設目標狀態為123804765 找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。輸入格...

1225 八數碼難題

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解檢視執行結果 description yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留...