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

一开始没有注意答案为0的情况然后就WA了...

挺水的BFS..

------------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<queue>

#include<cctype>

#include<iostream>

#define rep( i , n ) for( int i = 0 ; i < n ; ++i )

#define clr( x , c ) memset( x , c , sizeof( x ) )

using namespace std;

const int N = 4;

const int dir[ 4 ][ 2 ] = { { 0 , 1 } , { 0 , -1 } , { 1 , 0 } , { -1 , 0 } };

bool a[ N ][ N ];

int encode() {

int ans = 0;

int p = 15;

rep( i , N )

rep( j , N ) {

if( a[ i ][ j ] ) ans |= 1 << p;

p--;

}

return ans;

}

void decode( int code ) {

int p = 15;

rep( i , N )

rep( j , N ) {

a[ i ][ j ] = ( code & ( 1 << p ) ? true : false );

p--;

}

}

#define ok( x , y ) ( x >= 0 && x < 4 && y >= 0 && y < 4 )

int goal , start;

void Read() {

rep( i , N )

rep( j , N ) {

char c = getchar();

while( ! isdigit( c ) ) c = getchar();

a[ i ][ j ] = c - ‘0‘;

}

start = encode();

rep( i , N )

rep( j , N ) {

char c = getchar();

while( !isdigit( c ) ) c = getchar();

a[ i ][ j ] = c - ‘0‘;

}

goal = encode();

}

queue< pair< int , int > > Q;

bool S[ 1 << 16 ];

int BFS() {

if( start == goal ) return 0;

clr( S , 0 );

Q.push( make_pair( start , 0 ) );

while( ! Q.empty() ) {

int x = Q.front().first , d = Q.front().second;

Q.pop();

decode( x );

rep( i , N )

rep( j , N ) if( a[ i ][ j ] )

rep( k , 4 ) {

int X = i + dir[ k ][ 0 ] , Y = j + dir[ k ][ 1 ];

if( a[ X ][ Y ] || ! ok( X , Y ) ) continue;

a[ i ][ j ] = false;

a[ X ][ Y ] = true;

int s = encode();

if( s == goal ) return d + 1;

if( ! S[ s ] ) {

Q.push( make_pair( s , d + 1 ) );

S[ s ] = true;

}

a[ i ][ j ] = true;

a[ X ][ Y ] = false;

}

}

}

int main() {

Read();

cout << BFS() << "\n";

return 0;

}

------------------------------------------------------------------------------

1054: [HAOI2008]移动玩具

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

时间: 2024-10-05 19:10:20

BZOJ 1054: [HAOI2008]移动玩具( BFS )的相关文章

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】1054: [HAOI2008]移动玩具(bfs+hash)

http://www.lydsy.com/JudgeOnline/problem.php?id=1054 一开始我还以为要双向广搜....但是很水的数据,不需要了. 直接bfs+hash判重即可. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> using n

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的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人

[HAOI 2005][BZOJ 1054] 移动玩具

先贴一波题面 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2288  Solved: 1270 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动 时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移 动到某人心中的目标状态. Input 前4行表示玩具的初始状态,每行4个数字1或0,

BZOJ 1054 广搜

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

BZOJ 1054 题解

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

BZOJ1054: [HAOI2008]移动玩具

1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1028  Solved: 555[Submit][Status] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态. Input 前4行表示玩具的初始状态,每行4个

[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 移动玩具

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