time limit: 10 sec memory limit: 162 mb
submit: 1028 solved: 555
[submit][status]
在乙個4*4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。
前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒有放置玩具。接著是乙個空行。接下來4行表示玩具的目標狀態,每行4個數字1或0,意義同上。
乙個整數,所需要的最少移動次數。
1111
0000
1110
0010
1010
0101
1010
0101
4題解:
爆搜。。。
**:1.自己寫的一直wa,不知道為什麼
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #includeview code10 #include11
#define inf 1000000000
12#define maxn 30000000+1000
13#define maxm 1000000
14#define eps 1e-10
15#define ll long long
16using
namespace
std;
17 inline int
read()
1821
while(ch>='
0'&&ch<='9')
22return x*f;23}
24int s=0,t=0,q[maxn],d[maxm],m[20
];25
char
ch;26
intmain()
2738
for(int i=1;i<=16;i++)
3944
int l=0,r=1;q[1]=s;d[s]=0
;45 memset(d,0,sizeof
(d));
46while(l
4758}59
if(i%4!=0&&!(m[i+1]&x))
6065}66
if((i-1)/4!=0&&!(m[i-4]&x))
6772}73
if((i-1)/4!=3&&!((m[i+4]&x)))
7479}80
}81}82
return0;
83 }
2.別人的pascal
1view codevar2
i,j,a,y,min:longint;
3s:string;
4 m:array[0..5,0..5] of
boolean;
5 o:array[0..65535] of
longint;67
function
js:longint;
8var
9i,j,a:longint;
10begin
11 a:=0;12
for i:=1to4
do13
for j:=1to4
do14
if m[i,j] then a:=(a shl 1)+1
else a:=a shl 1;15
exit(a);
16end;17
18procedure
bfs(x,t:longint);
19var
20i,j:longint;
21begin
22if t>=min then
exit;
23if x=y then
24begin
25 min:=t;
26exit;
27end;28
if t>=o[x] then
exit;
29 o[x]:=t;
30for i:=1to4
do31
for j:=1to4
do32
if m[i,j] then
33begin
34if m[i-1,j]=false then
35begin
36 m[i-1,j]:=true;
37 m[i,j]:=false;
38 bfs(js,t+1
);39 m[i,j]:=true;
40 m[i-1,j]:=false;
41end;42
if m[i+1,j]=false then
43begin
44 m[i+1,j]:=true;
45 m[i,j]:=false;
46 bfs(js,t+1
);47 m[i,j]:=true;
48 m[i+1,j]:=false;
49end;50
if m[i,j-1]=false then
51begin
52 m[i,j-1]:=true;
53 m[i,j]:=false;
54 bfs(js,t+1
);55 m[i,j]:=true;
56 m[i,j-1]:=false;
57end;58
if m[i,j+1]=false then
59begin
60 m[i,j+1]:=true;
61 m[i,j]:=false;
62 bfs(js,t+1
);63 m[i,j]:=true;
64 m[i,j+1]:=false;
65end;66
end;
67end;68
69begin
70 min:=100;71
for i:=0to5
do72
begin
73 m[i,0]:=true;
74 m[i,5]:=true;
75 m[0,i]:=true;
76 m[5,i]:=true;
77end;78
for i:=0
to65535
do o[i]:=1 shl 31-1;79
for i:=1to4
do80
begin
81readln(s);
82for j:=1to4
do83
if s[j]='1'
then m[i,j]:=true else m[i,j]:=false;
84end;85
readln;
86for i:=1to4
do87
begin
88readln(s);
89for j:=1to4
do90
if s[j]='1'
then y:=(y shl 1)+1
else y:=y shl 1;91
end;
92 bfs(js,0
);93
writeln(min);
94end.
Bzoj 1054 HAOI2008 移動玩具
在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒...
bzoj1054 HAOI2008 移動玩具
無聊時想練一下構圖又懶得打廣搜 發現狀態只有2 16種 於是根據相鄰狀態連邊 最多只有2 22條邊 極有可能不到 然後直接跑最短路即可 如下 include using namespace std define n 100005 define m 4200000 define inf 1000000...
bzoj1054 HAOI2008 移動玩具
description 在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動 時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移 動到某人心中的目標狀態。input 前4行表示玩具的初始狀態,每行4個數字...