1054: [HAOI2008]移动玩具

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1272  Solved: 690

[Submit][Status][Discuss]

Sample Input

1111 0000 1110 0010 1010 0101 1010 0101

4

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);
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
36                        inc(x0,(ord(ch)-48)*list[num(i,j)]);
37                   end;
39          end;
41      for i:=1 to 4 do
42          begin
43               for j:=1 to  4 do
44                   begin
46                        inc(x1,(ord(ch)-48)*list[num(i,j)]);
47                   end;
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.```

250 篇文章37 人订阅

0 条评论

相关文章

1003

961

732

6726

3756

3319

852

庖丁解牛切割数据！| 【SAS Says·扩展篇】

【SAS Says·扩展篇】庖丁解牛割数据！ | 3. call PRXSUBSTR () 0. 前集回顾 1. 新的问题 2. 初识 PRXSUBSTR() ...

3326

7136

6062