問題描述
有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 做朋友,即當且僅當自己 的能力值大於對方時他們會成為朋友,另一種是大神我們做朋友,即當且僅當自己的能力 值小於對方時他們會成為朋友。現在告訴你兩種人的能力值。請你計算一共有多少對友好關係。排序 二分,因為排好序了,...