[BZOJ1054][HAOI2008]移动玩具 bfs+hash
1054: [HAOI2008]移动玩具
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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
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 }
O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~