zoukankan      html  css  js  c++  java
  • 1054: [HAOI2008]移动玩具

    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.
  • 相关阅读:
    Go 工作空间 深度解析
    go语言中获取变量类型的三种方法
    go语言实现分布式对象存储系统之单体对象存储
    curl命令用法
    删除Git服务器文件但是保留本地文件
    pycharm之gitignore设置
    通过pycharm使用git
    python 有关datetime时间日期 以及时间戳转换
    Please, commit your changes or stash them before you can merge
    jinkins配置python虚拟环境
  • 原文地址:https://www.cnblogs.com/HansBug/p/4477938.html
Copyright © 2011-2022 走看看