BZOJ 1054 [HAOI2008]移动玩具

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1388  Solved: 764
[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

题解:bfs爆搜咯

窝一开始vis忘维护了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MLE了N发啊啊啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<stack>
 6 #include<queue>
 7 #include<cstring>
 8 #define PAU putchar(' ')
 9 #define ENT putchar('\n')
10 using namespace std;
11 const int lim=1<<16;
12 const int dx[]={0,0,-1,1};
13 const int dy[]={-1,1,0,0};
14 bool vis[lim];
15 int id(int i,int j){return i*4+j;}
16 struct data{int key,d;};
17 int pack(bool A[4][4]){
18     int res=0;
19     for(int i=0;i<4;i++)
20         for(int j=0;j<4;j++)
21             if(A[i][j])res|=(1<<id(i,j));return res;
22 }
23 inline int read(){
24     int x=0;bool sig=1;char ch=getchar();
25     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
26     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
27     return sig?x:-x;
28 }
29 inline void write(int x){
30     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
31     int len=0,buf[20];while(x)buf[len++]=x%10,x/=10;
32     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
33 }
34 bool start[4][4],endin[4][4];int S,T;
35 char s[6];
36 int bfs(){
37     queue<data>Q;Q.push((data){S,0});vis[S]=true;
38     while(!Q.empty()){
39         data x=Q.front();Q.pop();
40         if(x.key==T)return x.d;
41         for(int i=0;i<4;i++){
42             for(int j=0;j<4;j++){
43                 if(x.key&(1<<id(i,j)))for(int d=0;d<4;d++){
44                     int i2=i+dx[d],j2=j+dy[d];
45                     if(i2>=0&&i2<4&&j2>=0&&j2<4&&(!(x.key&(1<<id(i2,j2))))){
46                         int v=x.key;v|=(1<<id(i2,j2));v-=(1<<id(i,j));
47                         if(!vis[v])Q.push((data){v,x.d+1}),vis[v]=true;
48                     }
49                 }
50             }
51         }
52     }return -1;
53 }
54 int main(){
55     for(int i=0;i<4;i++){
56         scanf("%s",s);
57         for(int j=0;j<4;j++)if(s[j]-'0')start[i][j]=true;
58     }
59     for(int i=0;i<4;i++){
60         scanf("%s",s);
61         for(int j=0;j<4;j++)if(s[j]-'0')endin[i][j]=true;
62     }
63     S=pack(start);T=pack(endin);
64     write(bfs());
65     return 0;
66 }

 

你可能感兴趣的:(BZOJ 1054 [HAOI2008]移动玩具)