题意:一共有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加状态压缩)相关推荐

  1. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  2. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  3. BFS + 状态压缩总结

    BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...

  4. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  5. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  6. UVa 11624,两次BFS

    题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...

  7. bfs+状态压缩dp

    题意:       给你一个地图,问你吧所有的隧道都走完的最小费用,起点不固定,穿越隧道的时间不计,在隧道外边每移动一步花费一秒. 思路:       先bfs求出所有dis[i][j](i的终点和j ...

  8. hdu 4012(bfs+位压缩)

    转载标记处:http://blog.csdn.net/kalilili/article/details/43560257 思路:每次涂色以后必有一个格子的颜色是最终的颜色,否则这次涂色根本没意义,所以 ...

  9. poj 1324(BFS+状态压缩)

    解题思路:这道题一开始的想法就是状态压缩,即考虑如何判重,由于蛇并非是直线的,所以想到了以每一个点的上下左右共四个 值来表示相对位置.最开始想如何用四进制来表示它,无语.....还是题目做少了,直接用 ...

最新文章

  1. 程序员版《我和我的家乡》,拼搏奋斗的IT人是家乡的骄傲!
  2. java反射中,Class.forName和classloader的区别
  3. iphone-common-codes-ccteam源代码 CCGraphics.m
  4. 文件和参数一起上传_Spring boot的文件上传
  5. Qt中rcc工具简介
  6. alias中后面的命令不执行的问题(没有解决 )
  7. [PAT乙级]1039 到底买不买
  8. C语言数据类型 / 变量类型 - C语言零基础入门教程
  9. 2021年中国家装行业数字化转型研究报告
  10. 渗透测试:k8s的3种攻击手段(Kubernetes、未授权漏洞,端口:8080、6443、10250)
  11. 摄影测量学(第三版)_王佩军_考试复习资料
  12. 小程序-腾讯视频插件
  13. 深入解析数据压缩算法
  14. java 8 doc_java8 doc 中文
  15. Jmeter接口压力测试(先登录再测接口)
  16. ScrollView 嵌套 RecyclerView 高度自适应遇到的问题
  17. 把时间当作朋友 读后感
  18. 网络运维工具--shell批量下发
  19. 高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
  20. Lind.DDD.API核心技术分享

热门文章

  1. Redis分布式锁的实现原理
  2. 性能建议(这里只针对单机版redis持久化做性能建议)
  3. 常用的函数式接口_Consumer接口的默认方法andThen
  4. Hive的基本操作-创建分区表
  5. 初始springCloud
  6. SpringBoot新版
  7. Redisson框架快速入门
  8. spring事务环境搭建
  9. 华为手机记事本导出_涨知识!原来华为手机自带的录音转文字这么好用,秒变会议神器...
  10. 骁龙660_高通骁龙660可以带动6g运行内存吗?