BZOJ 1054 题解

1054: [HAOI2008]移动玩具

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

Solution

裸广搜,将状态用二进制数表示即可。

  1 /**************************************************************
  2     Problem: 1054
  3     User: shadowland
  4     Language: C++
  5     Result: Accepted
  6     Time:108 ms
  7     Memory:16152 kb
  8 ****************************************************************/
  9
 10 #include "bits/stdc++.h"
 11
 12 using namespace std;
 13 struct Matrix { int M[ 6 ][ 6 ] , num ; } ;
 14 const int maxN = 100100 ;
 15 const int INF = 2147483647 ;
 16 typedef long long QAQ ;
 17
 18 Matrix Goal , Q[ maxN ] ;
 19 int Find_Table[ maxN ] ;
 20 bool vis[ 10 ][ 10 ] ;
 21 int dx[ 10 ] = { -1 , 0 , 1 , 0 } , dy[ 10 ] = { 0 , 1 , 0 , -1 } ;
 22
 23 QAQ ans , final ;
 24
 25 int Condense ( Matrix tmp ) {
 26         int ret = 0 ;
 27         for( int i=1 ; i<=4 ; ++i )
 28                 for( int j=1 ; j<=4 ; ++j )
 29                         ret = ( ret << 1 ) + tmp.M[ i ][ j ] ;
 30         return ret ;
 31 }
 32
 33 bool Judge( Matrix SHHHS ) {
 34         int tmp = Condense( SHHHS ) ;
 35         if ( tmp == ans ){ final = SHHHS.num ; return true ; }
 36         bool key = true ;
 37         if ( Find_Table[ tmp ] == true ) key = false ;
 38
 39         if ( key == true ) Find_Table[ tmp ] = true ;
 40         if ( key == true ) return true ;
 41         else               return false ;
 42 }
 43
 44 void BFS ( ) {
 45         Find_Table[ Condense( Q[ 1 ] ) ] = true ;
 46         int head = 1 , tail = 1 ;
 47         while( head <= tail ) {
 48                 Matrix t1 = Q[ head ] ;
 49                 for ( int i=1 ; i<=4 ; ++i ) {
 50                         for ( int j=1 ; j<=4 ; ++j ) {
 51                                 if ( t1.M[ i ][ j ] == 0 ) {
 52                                         for ( int xi=0 ; xi<4 ; ++xi ) {
 53                                                 int xx = i + dx[ xi ] ;
 54                                                 int yy = j + dy[ xi ] ;
 55                                                 if( vis[ xx ][ yy ] ){
 56                                                         Matrix t2 = t1 ;
 57                                                         ++ t2.num ;
 58                                                         t2.M[ xx ][ yy ] = t1.M[ i ][ j ] ;
 59                                                         t2.M[ i ][ j ] = t1.M[ xx ][ yy ] ;
 60                                                         if( Judge( t2 ) ) Q[ ++ tail ] = t2 ;
 61                                                         if( final ) return ;
 62                                                 }
 63                                         }
 64                                 }
 65                         }
 66                 }
 67                 ++ head ;
 68         }
 69         return;
 70 }
 71
 72 int main( ) {
 73
 74         memset ( vis , true , sizeof ( vis ) ) ;
 75
 76         for ( int i=1 ; i<=4 ; ++i ) {
 77                 for ( int j=1 ; j<=4 ; ++j ) {
 78                         char ch = getchar ( ) ;
 79                         Q[ 1 ].M[ i ][ j ] = ch - ‘0‘ ;
 80                 }
 81                 getchar ( ) ;
 82         }
 83
 84         getchar ( ) ;
 85
 86         for ( int i=1 ; i<=4 ; ++i ){
 87                 for ( int j=1 ; j<=4 ; ++j ){
 88                         char ch = getchar ( ) ;
 89                         Goal.M[ i ][ j ] = ch - ‘0‘ ;
 90                 }
 91                 getchar ( ) ;
 92         }
 93
 94         ans = Condense( Goal );
 95         if ( ans == Condense ( Q[ 1 ] ) ) { cout << ‘0‘ << endl ; goto End ;}
 96         BFS ( ) ;
 97         printf( "%lld\n" , final );
 98         End :
 99         return 0;
100 }

2016-10-14 23:41:11

()

时间: 2024-08-28 11:31:11

BZOJ 1054 题解的相关文章

BZOJ 1054题解 BFS暴力求解

BZOJ 1054题解 BFS暴力求解 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1884  Solved: 1033[Submit][Status][Discuss] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人

BZOJ 1054 [HAOI2008]移动玩具

直接暴力广搜即可.. [网上有大神说双向广搜速度快,然而直接暴力广搜就可以过了] 队列中的状态用二进制来存储.. 我用了一个比较sb的写法,勿喷qaq 1 #include <queue> 2 #include <cstdio> 3 4 using namespace std; 5 6 unsigned int Start, End; 7 bool M[4][4]; 8 9 const int dx[] = {+0, +0, +1, -1}; 10 const int dy[] =

点分治专题——bzoj 1468 &amp;bzoj 2152 题解

[前言]最近一直在忙着学算法,但是效果似乎不是很好.前段时间的树剖也快忘了= =.树套树没熟练,就开始写主席树了= =.更别说本身就不是很懂的莫比乌斯反演了.~~决定好好复习一下. [点分治的作用]套用SYC大神的话说是:用来解决树上路径点权统计问题. [大致流程] ①找出这颗树的重心. ②统计经过这个重心的答案 ③用重心把树割开 ④对每个"小树"做同样的事 [Q1--重心]其实找重心再进行计算只是为了不被卡链.什么是重心?就是当前树中的一个点K,使得MAX(SON[K])最小.SON

bzoj一句话题解

bzoj一句话题解 by wawawa8 1000 a+b 1001 平面图最小割->对偶图最短路 1002 就是生成树个数,通过基尔霍夫矩阵可以得出递推式 \(f_i=3f_{i-1}-f_{i-2}+2\),然后高精度算一下 1003 令 \(c[i][j]\) 表示从第 \(i\) 天到第 \(j\) 天从 \(1\) 到 \(n\) 不转换路线的最短距离,然后 \(f[i]\) 表示前 \(i\) 天所需要的最小成本,枚举上一次修改路线的位置 \(j\),即 \(f_i=f_j+c[j+

BZOJ 1054 广搜

1054: [HAOI2008]移动玩具 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人心中的目标状态. Input 前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具.接着是一个空 行.接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上. Output 一个整数,所需要的最少移动次数.

BZOJ 1054 移动玩具

Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的. Input 第一行四个整数W.I.N.G.表示每一个字母能由几种两个字母所替代.接下来W行,每行两个字母,表示W可以用这两个字母替代.接下来I行,每行两个字母,表示I可以用这两个字母替代.接下来N行,

BZOJ 4868-4873 题解

BZOJ4868 每个结束位置的最优值很显然具有单调性,三分,再讨论一下就好了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define FILE "exam" 5 #define up(i,j,n) for(int i=j;i<=n;i++) 6 #define db long double 7 #define pii pair<int,int>

[BZOJ 1054][HAOI 2008]移动玩具(BFS+判重)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1054 真是水题,感谢HAOI送的福利样例23333 裸BFS,用string做判重,会八数码就会这题. 注意由于队列中状态数很多,一定要把队列的数组开大点!!! #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <

BZOJ 1054: [HAOI2008]移动玩具( BFS )

一开始没有注意答案为0的情况然后就WA了... 挺水的BFS.. ------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cctype> #include<iostream>