一共有16個位置,最多會有 \(2^=65536\) 種情況,用陣列完全開的下。
用二進位制中的1表示該位置有玩具,0表示該位置沒有玩具。
由於廣搜最先搜到的是最優解,直接用陣列記錄是否到達過該狀態,順便記錄ans.
移動前的狀態ans為0.
然後大力討論12種情況即可
時間複雜度o( \(2^\) )o(能過)
獻上我又臭又長的**
#include#include#include#includeusing namespace std;
int z[524289],pan[524289];
int a,b,d;
char c;
queueq;
int ex(int s,int li,int ri)
for(int i=1;i<=16;++i)
if(a==b)
pan[a]=1;
q.push(a);
while(!q.empty())
if((d&(1<<11))==0)
}for(int i=2;i<=3;++i)//2~3號位
if((d&(1<<(16-i-1)))==0)
if((d&(1<<(16-i-4)))==0)}}
if(d&(1<<12))//4號位
if((d&(1<<8))==0)
}if(d&(1<<11))//5號位
if((d&(1<<10))==0)
if((d&(1<<7))==0)
}for(int i=6;i<=7;++i)//6~7號位
if((d&(1<<(16-i+1)))==0)
if((d&(1<<(16-i-1)))==0)
if((d&(1<<(16-i-4)))==0)}}
if(d&(1<<8))//8號位
if((d&(1<<9))==0)
if((d&(1<<4))==0)
}if(d&(1<<7))//9號位
if((d&(1<<6))==0)
if((d&(1<<3))==0)
}for(int i=10;i<=11;++i)//10~11號位
if((d&(1<<(16-i+1)))==0)
if((d&(1<<(16-i-1)))==0)
if((d&(1<<(16-i-4)))==0)}}
if(d&(1<<4))//12號位
if((d&(1<<5))==0)
if((d&(1<<0))==0)
}if(d&(1<<3))//13號位
if((d&(1<<2))==0)
}for(int i=14;i<=15;++i)//14~15號位
if((d&(1<<(16-i+1)))==0)
if((d&(1<<(16-i-1)))==0)}}
if(d&(1<<0))//16號位
if((d&(1<<4))==0)}}
cout
return 0;
}
Bzoj 1054 HAOI2008 移動玩具
在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移動到某人心中的目標狀態。前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,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個數字...