UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)
生活随笔
收集整理的這篇文章主要介紹了
UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:一共有15個洞,成三角形分布,有一個洞是空的,其余都是有一個小球,小球可以穿過一個或多個小球到空洞里,被穿過的小球就被拿走(注意,穿過的小球必須至少一個),最后只剩一個小球,且在開始時候的空位上,問最少多少步,結果按字典序最小輸出。
分析:此題不難想到用bfs搜索,數據儲存是一個難點,數據成三角形,每一個點最多和6給點相鄰。于是可以先列舉這15個點的相鄰節點,因為要按照字典序輸出,所以方向依次是左上,右上,左,右,左下,右下。每次搜索小球位置,連續在一個方向上搜索兩次,然后再判斷在這個方向上是否有空地節點。
代碼:
# include<iostream> # include<cstdio> # include<cmath> # include<map> # include<queue> # include<string> # include<string.h> #include<set> #include<list> # include<algorithm> using namespace std; const int jump[15][6] = { {-1,-1,-1,-1,2,3},{-1,1,-1,3,4,5},{1,-1,2,-1,5,6},{-1,2,-1,5,7,8},{2,3,4,6,8,9},{3,-1,5,-1,9,10}, {-1,4,-1,8,11,12},{4,5,7,9,12,13},{5,6,8,10,13,14}, {6,-1,9,-1,14,15},{-1,7,-1,12,-1,-1},{7,8,11,13,-1,-1}, {8,9,12,14,-1,-1},{9,10,13,15,-1,-1},{10,-1,14,-1,-1,-1} }; int em; struct node {int s;int num;int len;int path[2][15]; }; void bfs() {queue<node>q;set<int>ms;node temp;temp.s = ((1 << 16) - 1) ^ (1 << (em - 1));//將有小球的節點用1表示temp.num = 14;temp.len = 0;q.push(temp);while (!q.empty()) {node u = q.front(); q.pop();for (int i = 0; i < 15; i++) {if ((1 << i)&u.s) {//如果這個點有小球for (int j = 0; j < 6; j++) {//尋找周圍的小球int cur = i;node v = u;if (jump[cur][j] != -1 && v.s&(1 << (jump[cur][j] - 1))) {//找到小球while (cur >= 0 && (v.s&(1 << cur))) {//判斷這個方向上是否有空洞v.s ^= (1 << cur);//途中的小球變成空洞v.num--;cur = jump[cur][j] - 1;//同一個方向繼續向下}if (cur < 0)continue;v.s |= (1 << cur);//終點空洞加入小球v.path[0][v.len] = i + 1;v.path[1][v.len] = cur + 1;v.len++;v.num++;if (!ms.count(v.s)) {//判重if (v.num == 1 && v.s&(1 << (em - 1))) {//小球只剩下一個,且在開始的空洞中cout << v.len << endl;cout << v.path[0][0] << " " << v.path[1][0];for (int h = 1; h < v.len; h++) {cout << " " << v.path[0][h] << " " << v.path[1][h];}cout << endl;return;}ms.insert(v.s);q.push(v);}}}}}}cout << "IMPOSSIBLE"<<endl; } int main() {int kase; cin >> kase;while (kase--) {cin >> em;bfs();} }?
?
?
總結
以上是生活随笔為你收集整理的UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA - 12569 Planning
- 下一篇: UVA - 817According t