Bzoj 1054 HAOI2008 移動玩具

2021-07-05 16:23:20 字數 1043 閱讀 9706

在乙個4*4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。

前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒有放置玩具。接著是乙個空行。接下來4行表示玩具的目標狀態,每行4個數字1或0,意義同上。

乙個整數,所需要的最少移動次數。

1111

0000

1110

0010

1010

0101

1010

0101

4
hash+dfs

用二進位制表示這個圖,若某個位置有玩具,則這個位置的二進位制表示的值是1,否則即為0。

例如:

1111

0000

1110

0010

其所表示的值為:

1111

0000

1110

0010(2

)=61666(10

) 之後的就是寬搜了,若某一位有玩具,則向它相鄰且無玩具的位置移動,並將移動後的hash值加入佇列,若搜到目標狀態的hash,則直接輸出步數。

#include 

#include

#include

#include

#include

using

namespace

std;

const

int n=4;

int st,en;

char s[5];

int used[1

<<16];

int dir[10]=;

int bfs(int u)}}

}}

}}int main()

for(int i=1;i<=n;i++)

cout

0;}

bzoj1054 HAOI2008 移動玩具

無聊時想練一下構圖又懶得打廣搜 發現狀態只有2 16種 於是根據相鄰狀態連邊 最多只有2 22條邊 極有可能不到 然後直接跑最短路即可 如下 include using namespace std define n 100005 define m 4200000 define inf 1000000...

bzoj1054 HAOI2008 移動玩具

description 在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動 時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移 動到某人心中的目標狀態。input 前4行表示玩具的初始狀態,每行4個數字...

bzoj1054 HAOI2008 移動玩具

題目 題目很簡單,二進位制壓縮成16位,然後bfs就好,但是有兩個坑點,需要注意一下。1.bfs時搜尋i 1,i 1時,目的是搜尋左邊那列和右邊那列,但是當i 4 0或i 4 3時會到上一行或者下一行 2.對於一些做法,目標狀態與起始狀態相等時會有錯誤 include using namespace...