首页 > 代码库 > BZOJ1054: [HAOI2008]移动玩具

BZOJ1054: [HAOI2008]移动玩具

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1028  Solved: 555
[Submit][Status]

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

题解:

爆搜。。。

代码:

1.自己写的一直WA,不知道为什么

 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set>10 #include<queue>11 #define inf 100000000012 #define maxn 30000000+100013 #define maxm 100000014 #define eps 1e-1015 #define ll long long16 using namespace std;17 inline int read()18 {19     int x=0,f=1;char ch=getchar();20     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}21     while(ch>=0&&ch<=9){x=10*x+ch-0;ch=getchar();}22     return x*f;23 }24 int s=0,t=0,q[maxn],d[maxm],m[20];25 char ch;26 int main()27 {28     freopen("input.txt","r",stdin);29     freopen("output.txt","w",stdout);30     m[0]=1;31     for(int i=1;i<=16;i++)m[i]=m[i-1]*2;32     for(int i=1;i<=16;i++)33     {34         ch= ;35         while(ch<0||ch>9)ch=getchar();36         if(ch==1)s+=m[i];37     }38     for(int i=1;i<=16;i++)39     {40         ch= ;41         while(ch<0||ch>9)ch=getchar();42         if(ch==1)t+=m[i];43     }44     int l=0,r=1;q[1]=s;d[s]=0;45     memset(d,0,sizeof(d));46     while(l<r)47     {48         int x=q[++l],y;49         for(int i=1;i<=16;i++)50         if((1<<i)&x)51         {52             if(i%4!=1&&!(m[i-1]&x))53             {54                 y=x-m[i];y+=m[i-1];55                 if(d[y]==0)q[++r]=y,d[y]=d[x]+1;56                 if(y==t)57                 {cout<<d[y]<<endl;return 0;}58             }59             if(i%4!=0&&!(m[i+1]&x))60             {61                 y=x-m[i];y+=m[i+1];62                 if(d[y]==0)q[++r]=y,d[y]=d[x]+1;63                 if(y==t)64                 {cout<<d[y]<<endl;return 0;}65             }66             if((i-1)/4!=0&&!(m[i-4]&x))67             {68                 y=x-m[i];y+=m[i-4];69                 if(d[y]==0)q[++r]=y,d[y]=d[x]+1;70                 if(y==t)71                 {cout<<d[y]<<endl;return 0;}72             }73             if((i-1)/4!=3&&!((m[i+4]&x)))74             {75                 y=x-m[i];y+=m[i+4];76                 if(d[y]==0)q[++r]=y,d[y]=d[x]+1;77                 if(y==t)78                 {cout<<d[y]<<endl;return 0;}79             }80         }81     }82     return 0;83 }
View Code

2.别人的pascal

 1 var 2 i,j,a,y,min:longint; 3 s:string; 4 m:array[0..5,0..5] of boolean; 5 o:array[0..65535] of longint; 6  7 function js:longint; 8 var 9 i,j,a:longint;10 begin11 a:=0;12 for i:=1 to 4 do13   for j:=1 to 4 do14     if m[i,j] then a:=(a shl 1)+1 else a:=a shl 1;15 exit(a);16 end;17 18 procedure bfs(x,t:longint);19 var20 i,j:longint;21 begin22 if t>=min then exit;23 if x=y then24   begin25   min:=t;26   exit;27   end;28 if t>=o[x] then exit;29 o[x]:=t;30 for i:=1 to 4 do31   for j:=1 to 4 do32     if m[i,j] then33       begin34       if m[i-1,j]=false then35         begin36         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;41         end;42       if m[i+1,j]=false then43         begin44         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;49         end;50       if m[i,j-1]=false then51         begin52         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;57         end;58       if m[i,j+1]=false then59         begin60         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;65         end;66       end;67 end;68 69 begin70 min:=100;71 for i:=0 to 5 do72   begin73   m[i,0]:=true;74   m[i,5]:=true;75   m[0,i]:=true;76   m[5,i]:=true;77   end;78 for i:=0 to 65535 do o[i]:=1 shl 31-1;79 for i:=1 to 4 do80   begin81   readln(s);82   for j:=1 to 4 do83     if s[j]=1 then m[i,j]:=true else m[i,j]:=false;84   end;85 readln;86 for i:=1 to 4 do87   begin88   readln(s);89   for j:=1 to 4 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);94 end.
View Code

 

BZOJ1054: [HAOI2008]移动玩具