[BZOJ1054][HAOI2008]移动玩具 bfs+hash

1054: [HAOI2008]移动玩具

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2432  Solved: 1355
[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
 
bfs+hash
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 char a[10][10];
 9 int t=0;
10 int k=1;
11 int now=0;
12 int dis[150005];
13 int q[150001];
14 void bfs() {
15     memset(dis,97,sizeof(dis));
16     
17     int head=0,tail=1;
18     q[head]=now;
19     dis[now]=0;
20     while(head!=tail) {
21         int n=q[head++];
22         for(int i=1;i<=4;i++) {
23             for(int j=1;j<=4;j++){
24                 int to=1<<((i-1)*4+j-1);
25                 if(!(n&to)) continue;
26                 if(i>1) {
27                     int tt=to>>4;
28                     if(!(n&tt)) {
29                         int next=n-to+tt;
30                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
31                         if(next==t){printf("%d",dis[next]);return;}
32                     }
33                 }
34                 if(j>1) {
35                     int tt=to>>1;
36                     if(!(n&tt)) {
37                         
38                         int next=n-to+tt;
39                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
40                         if(next==t){printf("%d",dis[next]);return;}
41                     }
42                 }
43                 if(j<4) {
44                     int tt=to<<1;
45                     if(!(n&tt)) {
46                         int next=n-to+tt;
47                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
48                         if(next==t){printf("%d",dis[next]);return;}
49                     }
50                 }
51                 if(i<4) {
52                     int tt=to<<4;
53                     if(!(n&tt)) {
54                         int next=n-to+tt;
55                         if(dis[next]>dis[n]+1) {dis[next]=dis[n]+1;q[tail++]=next;}
56                         if(next==t){printf("%d",dis[next]);return;}
57                     }
58                 }
59              }
60         }
61     }
62 }
63 int main(){
64     for(int i=1;i<=4;i++) {
65         scanf("%s",a[i]);
66         for(int j=1;j<=4;j++){
67             now+=(a[i][j-1]-'0')*k;
68             k<<=1;
69         }
70     }
71     k=1;
72     for(int i=1;i<=4;i++) {
73         char x[10];
74         scanf("%s",x);
75         for(int j=1;j<=4;j++){
76             t+=(x[j-1]-'0')*k;
77             k<<=1;
78         }    
79     }
80     bfs();
81 }
View Code

 

posted @ 2017-10-18 14:46  wls001  阅读(174)  评论(0编辑  收藏  举报