1054: [HAOI2008]移动玩具

时间:2022-05-08
本文章向大家介绍1054: [HAOI2008]移动玩具,主要内容包括1054: [HAOI2008]移动玩具、Description、Input、Output、Sample Input、Sample Output、HINT、Source、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1272  Solved: 690

[Submit][Status][Discuss]

Description

在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态。

Input

前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。

Output

一个整数,所需要的最少移动次数。

Sample Input

1111 0000 1110 0010 1010 0101 1010 0101

Sample Output

4

HINT

Source

题解:其实是一道水水哒搜索题,只要你知道怎么状压,怎么用一个数组判重同时记录最优值就好了

(PS:其实我WA掉的那一次是没特判开头结尾情况完全一样的情形,应该输出0,而我原来的程序将没有输出= =,注意下)

  1 /**************************************************************
  2     Problem: 1054
  3     User: HansBug
  4     Language: Pascal
  5     Result: Accepted
  6     Time:36 ms
  7     Memory:772 kb
  8 ****************************************************************/
  9  
 10 var
 11    i,j,k,l,m,n,x0,x1,x,y,f,r:longint;
 12    c,d:array[0..70000] of longint;
 13    list:array[0..20] of longint;ch:char;
 14 function num(x,y:longint):longint;inline;
 15          begin
 16               exit(4*(x-1)+y);
 17          end;
 18 function getit(x,y:longint):longint;inline;
 19          begin
 20               if odd(x div list[y]) then exit(1) else exit(0);
 21          end;
 22 procedure orz(x:longint);inline;
 23           begin
 24                writeln(x);
 25                readln;
 26                halt;
 27           end;
 28 begin
 29      list[1]:=1;for i:=2 to 16 do list[i]:=list[i-1]*2;
 30      x0:=0;x1:=0;
 31      for i:=1 to 4 do
 32          begin
 33               for j:=1 to  4 do
 34                   begin
 35                        read(ch);
 36                        inc(x0,(ord(ch)-48)*list[num(i,j)]);
 37                   end;
 38               readln;
 39          end;
 40      readln;
 41      for i:=1 to 4 do
 42          begin
 43               for j:=1 to  4 do
 44                   begin
 45                        read(ch);
 46                        inc(x1,(ord(ch)-48)*list[num(i,j)]);
 47                   end;
 48               readln;
 49          end;
 50      if x0=x1 then orz(0);
 51      for i:=0 to 65536 do c[i]:=maxlongint;
 52      d[1]:=x0;f:=1;r:=2;c[x0]:=0;
 53      while f<r do
 54            begin
 55                 l:=d[f];i:=1;x:=1;y:=0;
 56                 while l>0 do
 57                       begin
 58                            x:=x+y div 4;y:=y mod 4+1;
 59                            if odd(l) then
 60                               begin
 61                                    if x>1 then
 62                                       begin
 63                                            if getit(d[f],i-4)=0 then
 64                                               begin
 65                                                    d[r]:=d[f]-list[i]+list[i-4];
 66                                                    if c[d[r]]=maxlongint then
 67                                                       begin
 68                                                            c[d[r]]:=c[d[f]]+1;
 69                                                            if d[r]=x1 then orz(c[d[r]]);
 70                                                            inc(r);
 71                                                       end;
 72                                               end
 73                                       end;
 74                                    if x<4 then
 75                                       begin
 76                                            if getit(d[f],i+4)=0 then
 77                                               begin
 78                                                    d[r]:=d[f]-list[i]+list[i+4];
 79                                                    if c[d[r]]=maxlongint then
 80                                                       begin
 81                                                            c[d[r]]:=c[d[f]]+1;
 82                                                            if d[r]=x1 then orz(c[d[r]]);
 83                                                            inc(r);
 84                                                       end;
 85                                               end;
 86                                       end;
 87                                    if y>1 then
 88                                       begin
 89                                            if getit(d[f],i-1)=0 then
 90                                               begin
 91                                                    d[r]:=d[f]-list[i]+list[i-1];
 92                                                    if c[d[r]]=maxlongint then
 93                                                       begin
 94                                                            c[d[r]]:=c[d[f]]+1;
 95                                                            if d[r]=x1 then orz(c[d[r]]);
 96                                                            inc(r);
 97                                                       end;
 98                                               end;
 99                                       end;
100                                    if y<4 then
101                                       begin
102                                            if getit(d[f],i+1)=0 then
103                                               begin
104                                                    d[r]:=d[f]-list[i]+list[i+1];
105                                                    if c[d[r]]=maxlongint then
106                                                       begin
107                                                            c[d[r]]:=c[d[f]]+1;
108                                                            if d[r]=x1 then orz(c[d[r]]);
109                                                            inc(r);
110                                                       end;
111                                               end;
112                                       end;
113                               end;
114                            inc(i);l:=l div 2;
115                       end;
116                 inc(f);
117            end;
118 end.