無聊時想練一下構圖又懶得打廣搜……
發現狀態只有2^16種
於是根據相鄰狀態連邊
(最多只有2^22條邊(極有可能不到))
然後直接跑最短路即可
**如下
#include
using
namespace
std;
#define n 100005
#define m 4200000
#define inf 1000000000
char s[10];
int num,to[m],head[n],next[m];
int dis[n],flag[n],a[4][4],b[4][4];
int n;
struct node
;bool
operator > (node x,node y)
priority_queue heap;
inline
bool check1(int x,int y)
inline
bool check2(int x,int y)
inline
void add(int st,int x,int y,int xx,int yy)
int main()
}int st=0,ed=0;
for (int i=0;i<4;++i)
for (int i=3;i>=0;--i)
for (int j=3;j>=0;--j)
st=(st<<1)+(a[i][j]&1);
for (int i=0;i<4;++i)
for (int i=3;i>=0;--i)
for (int j=3;j>=0;--j)
ed=(ed<<1)+(a[i][j]&1);
//cout<<"st="dis[st]=0;
heap.push();
while (!heap.empty())
while (!flag[t]);
flag[t]=0;
for (int j=head[t];j;j=next[j])
if (flag[to[j]] && dis[to[j]]>dis[t]+1));}
}cout
<}
Bzoj 1054 HAOI2008 移動玩具
在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示沒...
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...