yours和zero在研究a*啟發式演算法.拿到一道經典的a*問題,但是他們不會做,請你幫他們.
問題描述
在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局(為了使題目簡單,設目標狀態為123804765),找到一種最少步驟的移動方法,實現從初始布局到目標布局的轉變。
輸入描述 input description
輸入初試狀態,一行九個數字,空格用0表示
輸出描述 output description
只有一行,該行只有乙個數字,表示從初始狀態到目標狀態需要的最少移動次數(測試資料中無特殊無法到達目標狀態資料)
樣例輸入 sample input
樣例輸出 sample output
資料範圍及提示 data size & hint
詳見試題
由題意得(討厭這句話),這是一道搜尋題,由於是找最少移動次數,所以應該是用廣度優先搜尋,為了節約時間,採用雙向寬度優先搜尋。當然,這是我第一次寫雙向寬搜,
應該有優化,但我並不知道怎麼寫,話說還有乙個叫a*的演算法……不造如何做!!!
1program
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的某一數字。棋盤中留...