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