UVA1533-Moving Pegs(BFS+状态压缩)
Problem UVA1533-Moving Pegs
Accept:106 Submit:375
Time Limit: 3000 mSec
Problem Description

Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case is a single integer which means an empty hole number.
Output
For each test case, the first line of the output file contains an integer which is the number of jumps in a shortest sequence of moving pegs. In the second line of the output file, print a sequence of peg movements. Apegmovementconsistsofapairofintegersseparatedbyaspace. Thefirstintegerofthe pair denotes the hole number of the peg that is moving, and the second integer denotes a destination (empty) hole number.
Sample Input
Sample Ouput
10
12 5 3 8 15 12 6 13 7 9 1 7 10 8 7 9 11 14 14 5
题解:15个洞,二进制存储状态是比较正的思路。接下来就是水题了,只不过是把矩形地图换成了三角形地图,预处理一个临接表,存一下对于每个点能到哪些点。因为要字典序,因此顺序很重要,稍加分析就知道周围6个位置的大小关系,注意对于15个记录相邻点的数组,一定要统一顺序,除了字典序,还因为有可能要顺着一个方向走几格,这时顺序一致就很方便。
#include <bits/stdc++.h> using namespace std; const int maxn = , maxm = ;
const int dir[maxn][maxm] =
{
{-,-,-,-, , }, {-, ,-, , , }, { ,-, ,-, , }, {-, ,-, , , },
{ , , , , , }, { ,-, ,-, , }, {-, ,-, ,,}, { , , , ,,},
{ , , , ,,}, { ,-, ,-,,}, {-, ,-,,-,-}, { , ,,,-,-},
{ , ,,,-,-}, { , ,,,-,-}, { ,-,,-,-,-}
}; int s;
bool vis[ << maxn];
pair<int, int> path[ << maxn];
int pre[ << maxn]; struct Node {
int sit, time;
int pos;
Node(int sit = , int time = , int pos = ) :
sit(sit), time(time), pos(pos) {}
}; int bfs(int &p) {
int cnt = ;
int ori = ( << maxn) - ;
ori ^= ( << s);
queue<Node> que;
que.push(Node(ori, , ));
vis[ori] = true;
while (!que.empty()) {
Node first = que.front();
que.pop();
if (first.sit == ( << s)) {
p = first.pos;
return first.time;
} int ssit = first.sit;
for (int i = ; i < maxn; i++) {
if (!(ssit&( << i))) continue; for (int j = ; j < maxm; j++) {
int Next = dir[i][j];
if (Next == - || !(ssit&( << Next))) continue; int tmp = ssit ^ ( << i);
while (Next != -) {
if (!(ssit&( << Next))) {
//printf("%d %d\n",i, Next);
tmp ^= ( << Next);
if (!vis[tmp]) {
Node temp(tmp, first.time + , ++cnt);
pre[cnt] = first.pos;
path[cnt] = make_pair(i, Next);
que.push(temp);
vis[tmp] = true;
}
break;
}
tmp ^= ( << Next);
Next = dir[Next][j];
}
}
}
}
return -;
} void output(int pos) {
if (!pre[pos]) {
printf("%d %d", path[pos].first + , path[pos].second + );
return;
}
output(pre[pos]);
printf(" %d %d", path[pos].first + , path[pos].second + );
} int main()
{
int iCase;
scanf("%d", &iCase);
while (iCase--) {
scanf("%d", &s);
s--;
memset(vis, false, sizeof(vis));
memset(pre, -, sizeof(pre));
int pos;
int ans = bfs(pos);
if (ans == -) {
printf("IMPOSSIBLE\n");
}
else {
printf("%d\n", ans);
output(pos);
printf("\n");
}
}
return ;
}
UVA1533-Moving Pegs(BFS+状态压缩)的更多相关文章
- UVALive 2520 Holedox Moving(BFS+状态压缩)
这个题目在比赛的时候我们是没有做出来的,但是听到他们说进制哈希的时候,感觉真的是挺高端的,于是赛后开始补题,本着我的习惯在看题解之前自己再试着写一遍,我当时存储状态的方法是string + map,我 ...
- ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...
- HDU1429+bfs+状态压缩
bfs+状态压缩思路:用2进制表示每个钥匙是否已经被找到.. /* bfs+状态压缩 思路:用2进制表示每个钥匙是否已经被找到. */ #include<algorithm> #inclu ...
- BFS+状态压缩 hdu-1885-Key Task
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...
- poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)
Description Flip game squares. One side of each piece is white and the other one is black and each p ...
- BFS+状态压缩 HDU1429
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdoj 5094 Maze 【BFS + 状态压缩】 【好多坑】
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others) Total Sub ...
- HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...
- UVA-1533 Moving Pegs (路径寻找问题)
Description Venture MFG Company, Inc. has made a game board. This game board has 15 holes and thes ...
随机推荐
- 新浪IP库地址
新浪IP库地址 http://int.dpool.sina.com.cn/iplookup/iplookup.php
- linux 中rc是什么意思
在Linux中,最为常用的缩略语也许是"rc" 它是"runcomm"的缩写――即名词"run command"(运行命令)的简写.rc&q ...
- VSCode Snippet 小试牛刀
这几天因为一个需求,要不断重复一个用特定代码段去包围不同代码的需求. 这个要不断移动鼠标以及重复敲打相同代码的体力活,实在让我老眼昏花,体内的懒人之力迫使我想一个快捷的方法来代替之. 之前就知道Sni ...
- JavaScript函数重载
译者按: jQuery之父John Resig巧妙地利用了闭包,实现了JavaScript函数重载. 原文: JavaScript Method Overloading 译者: Fundebug 为了 ...
- PS换脸操作
1,使用套索工具抠出人的五官. 2,Ctrl+C复制黏贴到另一张头像中,调节透明度50%,与需要换脸的头像的眼睛,嘴巴,鼻子重合,透明度回归100%. 3,为了不该变原图,需要新建一张原图. 4,在抠 ...
- laravel表单验证
效果展示: 代码 实现: 后台: use Validator; public function login() { if($input = Input::all()){ //验证提交的 ...
- js 字符串转数组
var obj = "123456".replace(/(.)(?=[^$])/g, "$1,").split(","); conso ...
- 95%的中国网站需要重写CSS
95%的中国网站需要重写CSS 很长一段时间,我都使用12px作为网站的主要字体大小.10px太小,眼睛很容易疲劳,14px虽容易看清,却破坏页面的美感.唯独12px在审美和视力方面都恰到好处. 谁对 ...
- 19.Odoo产品分析 (二) – 商业板块(11) – 在线活动(1)
查看Odoo产品分析系列--目录 点击安装"在线活动". 1. 主页 在线活动绑定在电子商务中,在网站中可以看到在线活动的菜单: 在这里可以按时间看到每一个活动. 2. 新建活动 ...
- 切换横竖屏的时候Activity的生命周期变化情况
关于这个,有个博客说得比较清楚:http://blog.csdn.net/wulianghuan/article/details/8603982,直接给出链接,哈哈哈.