八數碼問題 廣度優先搜尋 列舉判重

2021-05-26 23:46:04 字數 1963 閱讀 8675

const maxn=500000;

type

atp=record

s:string;

time:longint;

end;

var que:array[0..maxn] of atp;

head,tail,x:longint;

now:string;//儲存進行操作後的字串

procedure print;//判斷是否找到了目標狀態

begin

if que[tail].s='123804765' then

begin

writeln(que[tail].time);

halt;

end;

end;

function judge:boolean;//用列舉查詢是否在之前的狀態中出現過

var i:longint;

begin

for i:= 1 to tail do

if que[i].s=now then exit(false);

exit(true);

end;

begin

head:=1; tail:=1;

readln(que[head].s);

que[head].time:=0;

print;

while head<=tail do

begin

x:=pos('0',que[head].s);//查詢當前狀態的空格位置,以進行操作

if ( (x-1) div 3>0 ) then //空格可以向上移動

begin

now:=que[head].s;

now[x]:=now[x-3];

now[x-3]:='0';

if judge then

begin

inc(tail);

que[tail].s:=now;

que[tail].time:=que[head].time+1;

print;

end;

end;

if ( (x-1) div 3<2 ) then //空格可以向下移動

begin

now:=que[head].s;

now[x]:=now[x+3];

now[x+3]:='0';

if judge then

begin

inc(tail);

que[tail].s:=now;

que[tail].time:=que[head].time+1;

print;

end;

end;

if ( (x-1) mod 3>0 ) then //空格可以向左移動

begin

now:=que[head].s;

now[x]:=now[x-1];

now[x-1]:='0';

if judge then

begin

inc(tail);

que[tail].s:=now;

que[tail].time:=que[head].time+1;

print;

end;

end;

if ( (x-1) mod 3<2 ) then //空格可以向右移動

begin

now:=que[head].s;

now[x]:=now[x+1];

now[x+1]:='0';

if judge then

begin

inc(tail);

que[tail].s:=now;

que[tail].time:=que[head].time+1;

print;

end;

end;

inc(head);

end;

end.

廣度優先搜尋 八數碼問題

給定乙個一幅圖和乙個起點s,回答 從s到給定的頂點v是否存在一條路徑?如果有,找出其中最短的那條 所含邊數最少 邊數最少,很自然想到從從經過1條邊能到達的節點有哪些?然後經過這些邊再到達的節點有哪些?這樣我不就能夠想出來最短的路徑了嗎?沒錯,這是非常簡單的想法,然而真正的廣度優先演算法也是這樣,簡單...

八數碼問題(bfs廣度優先搜尋)

最近在學bfs,覺得這個題不錯,自己沒做出來,去網上搜了一下,又結合了我自己的想法,ac了 這個看起來用dfs比較好做,但是會超時好像,所以肯定用bfs了。問題描述 在九宮格裡放在1到8共8個數字還有乙個是x,與x相鄰的數字可以移動到x的位置,問給定的狀態最少需要幾步能到達目標狀態 1 2 3 4 ...

廣度優先搜尋解決八數碼問題

程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...