BZOJ1054 HAOI2008 移動玩具

2022-05-12 03:22:57 字數 3872 閱讀 9705

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 #include

10 #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 }

view code

2.別人的pascal

1

var2

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.

view code

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個數字...