特長生模擬 八數碼(bfs hash)

2021-08-01 10:34:16 字數 2594 閱讀 8500

問題描述

有3*3共9個格仔,其中有乙個格仔是空的,其他格仔填滿了1-8之間不同的數字。通過移動格仔可以改變量字和空格的位置,現在給你初狀態和末狀態,請你給出最少的步數。

問題輸入

給出6行,每行有三個數,每兩個數用乙個空格空開,每個數在0~8之間,其中0表示空格。前三行表示初始狀態,後三行表示目標狀態。

問題輸出

輸出一行乙個數,表示從初始狀態移動到目標狀態的最少步數。如果無解則輸出-1。

分析:求最優解我們可以想到bfs,但是怎麼記錄狀態判重是個問題。所以我們可以考慮把每種情況轉成乙個9位的十進位制數然後hash就好了

**

const

dx:array[1..4] of -1..1=(-1,0,1,0);

dy:array[1..4] of -1..1=(0,1,0,-1);

var s:array[0..100000,1..3] of longint;

b:array[0..100000,0..4,0..4] of

0..9;

a:array[0..4,0..4] of

0..9;

ha:array[0..10000007] of int64;

i,j,k,x,y:longint;

ans:int64;

function

check

(x,y:longint):boolean;

begin

if (x<1) or (y<1) or (x>3) or (y>3) then

exit(false);

exit(true);

end;

function

hash

(x:int64):longint;

var tmp:longint;

begin

tmp:=x mod

10000007;

while (ha[tmp]<>0) and (ha[tmp]<>x) do

tmp:=(tmp+1) mod

10000007;

exit(tmp);

end;

procedure

bfs;

var h,t,i,j,k,p:longint;

o:int64;

begin

h:=0;

t:=1;

s[1,1]:=x;

s[1,2]:=y;

while hdo

begin

inc(h);

for i:=1to4

dobegin

p:=0;

o:=0;

x:=s[h,1]+dx[i];

y:=s[h,2]+dy[i];

for k:=1to3

dofor j:=1to3

do a[k,j]:=b[h,k,j];

a[s[h,1],s[h,2]]:=a[x,y];

a[x,y]:=0;

for j:=1to3

dofor k:=1to3

do o:=o*10+a[j,k];

if check(x,y) and (ha[hash(o)]<>o) then

begin

inc(t);

s[t,3]:=s[h,3]+1;

s[t,1]:=x;

s[t,2]:=y;

ha[hash(o)]:=o;

for j:=1to3

dofor k:=1to3

do b[t,j,k]:=a[j,k];

if o=ans then

begin

writeln(s[t,3]);

close(input);close(output);

halt;

end;

end;

end;

end;

end;

begin

//assign(input,'eight.in');reset(input);

//assign(output,'eight.out');rewrite(output);

for i:=1to3

dofor j:=1to3

dobegin

read(b[1,i,j]);

if b[1,i,j]=0

then

begin

x:=i;

y:=j;

end;

ans:=ans*10+b[1,i,j];

end;

ha[hash(ans)]:=ans;

ans:=0;

for i:=1to3

dofor j:=1to3

dobegin

read(k);

ans:=ans*10+k;

end;

bfs;

writeln(-1);

close(input);close(output);

end.

特長生模擬 採藥

題目大意 凡凡要去採藥,他採的藥不僅要求揹包的總空間v能放得下所採的藥,還要求藥草的總質量不能超過凡凡所能承受的範圍m。現在給出n種珍惜的藥材,對於每個藥材凡凡都會精準地目測出其質量a i 體積b i 和價值c i 求凡凡所能採到的藥材的最大價值。注意 每種藥材只有乙個。30 資料,所有藥草質量a ...

特長生模擬 BIOtech(模擬)

2.1 題目描述 bob 發現了一群有趣的細胞。這群細胞排列成乙個n m 的矩陣。每個細胞有兩個狀態 放電狀態和平靜 狀態。它們每秒鐘都會按以下的規則轉換狀態 首先我們定義,乙個細胞的鄰居為它周圍的8 個細胞。同時設k 為某乙個細 胞的處於放電狀態的鄰居的個數。若k 2,則這個細胞在下一秒因電量不足...

5 14特長生模擬 朋友

mxy 即將前往新世界。在前往新世界的過程中,ta 遇見了兩種人。一種是只和lowb 做朋友,即當且僅當自己 的能力值大於對方時他們會成為朋友,另一種是大神我們做朋友,即當且僅當自己的能力 值小於對方時他們會成為朋友。現在告訴你兩種人的能力值。請你計算一共有多少對友好關係。排序 二分,因為排好序了,...