題解:瞎基本搜是沒有希望的,還是正常的bfs比較靠譜
看出4*4的格仔每行串在一起即是乙個01串,可以用類似於狀態壓縮的思想解決,將其轉化為十進位制數,主要為了判斷是否已經到了理想的狀態
佇列中儲存狀態,在bfs的時候取出隊首,針對每乙個棋子的四種移動產生新的狀態,再入隊處理即可
(有點搞不懂當時為什麼要用「hash」來命名這種狀態壓縮……)
1 #include2 #include3int st,en,_x=,_y=;
4bool vis[65536];5
struct
node
6q[65536
];10 inline int hash(bool a[5][5
])1120}
21return
ans;22}
23void
init()
2434}35
for(int i=1;i<=4;i++)
3642
}43 st=hash(q[1
].status);
44 en=hash(temp2);45}
46void
bfs()
4772 memcpy(q[tail].status,q[head].status,sizeof
(q[tail].status));
73 q[tail++].dep=q[head].dep+1
;74 vis[hash_of_status]=true;75
}76 q[head].status[i][j]=true
;77 q[head].status[x][y]=false;78
}79}80
}81}82 head++;83}
84}85int
main()
8693
bfs();
94return0;
95 }
BZOJ1054 移動玩具
time limit 10 sec memory limit 162 mb submit 2741 solved 1537 submit status discuss 在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動 時只能將玩具向上下左右四個方向移...
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...