记得以前做N皇后问题见到过二进制+位运算优化的方法, 今天的搜索题第三题和第四题都可以用到二进制和位运算. 就只做了这两个题目.


题目三

描述

传递游戏(pass)

Description
n个人在做传递物品的游戏,编号为1-n。
游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位;下一个人可以传递给未接过物品的任意一人。
即物品只能经过同一个人一次,而且每次传递过程都有一个代价;不同的人传给不同的人的代价值之间没有联系;
求当物品经过所有n个人后,整个过程的最小总代价是多少。
Input Format
第一行为n,表示共有n个人(16>=n>=2);
以下为n*n的矩阵,第i+1行、第j列表示物品从编号为i的人传递到编号为j的人所花费的代价,特别的有第i+1行、第i列为-1(因为物品不能自己传给自己),其他数据均为正整数(<=10000)。
Output Format
一个数,为最小的代价总和。


分析

  • 状压DP, 二进制表示状态(点到过或没到过), 位运算实现查找和更新等操作
  • f[i][k]表示状态为 k 并且最后停留在 i 点时的最小代价
  • => min{f[i][(1<<n)+1], (0<=i<n)}
  • 转移 :
    枚举状态 k : 0 -> (1 << n) - 1
    枚举要更新的结点 i : 0 -> n-1
    枚举中间结点 j : 0 -> n-1, (i != j)
    如果满足 在状态 k 中第 i 的位置为 0, 而第 j 的位置为 1, 那么就可以用 j 去更新 i.
  • 核心 :

      if(i != j && (k&(1 << j)) && !(k&(1 << i))) f[i][k^(1 << i)] = min(f[i][k^(1 << i)], f[j][k] + d[j][i]);
  • 初始化
    f[i][1 << i] = 0, (0<=i<n)
    表示从任意点出发


代码

https://code.csdn.net/snippets/609746


题目四

描述

皇后守卫(queen)
Description
给一个N * M的棋盘,棋盘上的有些格子被打上了标记。现在需要在其中放置尽量少的皇后,使得所有被打上标记的格子至少被某一个皇后攻击或占据到。皇后之间可以互相攻击。
Input Format
输入最多15组数据。
每组数据第一行包含两个整数N和M(1 < N, M < 10),以下为一个N行M列的棋盘,其中打上标记的格子用‘X’表示,其它格子用‘.’表示。
输入以一个0结尾。
Output Format
对于每组数据,输出一个数表示最少需要使用的皇后数目。


分析

  • 二进制+位运算优化+普通最优化剪枝的 dfs
  • void dfs(int x, int row, int ld, int rd, int* k, int c)
    x => 当前行
    k => 数组, 表示当前所有被覆盖的位置, 每一行都是用二进制表示的, 所以数组只需开一维
    c => 计数变量, 已经放的皇后数
    主函数调用dfs(0, 0, 0, 0, k, 0) // k 初始化全为 0
  • 函数执行过程
    如果该状态下满足了需要, 直接更新答案后返回
    如果所以行已经考虑完了(x >= n), 直接返回
    最优化剪枝 : 如果当前 c 不比已经记录的 ans 更优, 直接返回
    从当前行中选可以放置皇后的地方开始放皇后, 继续dfs到下一层
    该行不放皇后, dfs到下一层
  • 许多精巧的位运算 :

    • 判断是否满足条件, 标记的地方都被覆盖到
      枚举 x, 如果所有 (k[x]&tar[x]) == tar[x] 说明满足
      解释 : tar[x]表示第 x 行需要被覆盖的二进制状态. 只有当 tar[x] 为 1 的地方 k[x] 也为 1 才满足
    • 更新状态, 在第 x 行二进制下 p 位置放置皇后对原可覆盖状态 k 的影响
    void update(int x, int p, int* k)
    {
    k[x] = upperlim;
    for(int i = 1; x-i >= 0; i++) {if((p<<i) < upperlim) k[x-i] |= (p<<i);if((p>>i) > 0) k[x-i] |= (p>>i);k[x-i] |= p;
    }
    for(int i = 1; x+i < n; i++) {if((p<<i) < upperlim) k[x+i] |= (p<<i);if((p>>i) > 0) k[x+i] |= (p>>i);k[x+i] |= p;
    }
    }

    解释 : upperlim = (1 << n) - 1
    首先 x 行应该全变为 1, 也就是 k[x] 状态为 upperlim
    再考虑对角线和列
    对p的解释 : p 的二进制中只有一位为 1, 也就是皇后所在列的那一位

  • 其他
    • ans 可以初始化为 5
      在 9*9 全 ‘X’ 的棋盘上
    • 皇后可以互相攻击, 也就是同一行上可以有多个皇后

代码

https://code.csdn.net/snippets/609744



学校测试-2015-03-01相关推荐

  1. Cheatsheet: 2015 03.01 ~ 03.31

    Web The Architecture of Algolia's Distributed Search Network No promises: asynchronous JavaScript wi ...

  2. Contest2071 - 湖南多校对抗赛(2015.03.28)

    Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.csu.edu.cn/OnlineJudge/contest.php?c ...

  3. 湖南多校对抗赛(2015.03.28)

    Contest2071 - 湖南多校对抗赛(2015.03.28) Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.cs ...

  4. 03/01 开例会 jim williams uw-madison

    03/01 开例会 jim williams uw-madison 记录一下今天开会的过程 汇报第一个工作 是对比学校的课程表 我这周做的是对比我们学校和华大西雅图的基础cs课程 讲一下我发现的问题 ...

  5. 【389天】跃迁之路——程序员高效学习方法论探索系列(实验阶段146-2018.03.01)...

    @(一只心中无码的程序员)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:通过探索新的学习方法,用2年的时间,实现2.5倍速的成长,获得普通程序员>= 5年的技术水平. 实验 ...

  6. 深圳计算机学校排名2015年,2015深圳各区初中最新排名,10各区学校都有

    原标题:2015深圳各区初中最新排名,10各区学校都有 (家长帮)在择校过程当中,中考成绩的好坏很容易决定学生和家长的选择,不管是就近入学还是跨区入学,该学校在本区的排名是很重要的一个参考因素,所以无 ...

  7. 黑武器linux下载地址,酷毙了!暗黑版 Arch,BlackArch Linux 2017.03.01发布

    By - 3月, 2nd 2017 作者:闻其详 Arch 是大名鼎鼎的滚动更新的 Linux 发行版,江湖上哪个不知,谁个不晓,练就顶上的 Linux 功夫基本都不会绕路于它,然而就像杂粮中出有白米 ...

  8. 江苏计算机专业的学校排名2015,2015关于江苏省高校排名「最新」

    在2015中国大学排行榜700强中,江苏省有1所高校跻身全国十强,10所高校跻身全国百强.南京大学雄居2015江苏省最佳大学排行榜榜首,入选2015中国五星级大学,跻身中国一流大学,堪称2015江苏省 ...

  9. 上海计算机本科学校排名2015,2015上海大学排名大全(一流、二流、三流)

    2015上海大学排名大全(一流.二流.三流) 如下为大家整理的.是2015年上海一流.二流.三流大学的排名情况,具体详情如下: 超一流大学 01.复旦大学("985"工程与&quo ...

  10. 邯郸计算机学校排名2015,邯郸市2014(2015、2016)年各县市区高考成绩排名

    邯郸市第一中学新校区 2014年高考,邯郸市本科上线率全面提升,省级示范性高中高位增长,高分人数尤其是清华.北大录取人数倍增,这增强了本地学校的竞争力,许多家长为自己的孩子能考进优质大学开心不已.而每 ...

最新文章

  1. 深蓝学院的三维点云课程:第一章
  2. 异地多活实践与设计思考点归纳
  3. Opencv 数学基础--范数(17)
  4. 抖音很火的存钱计划,让python告诉你总共可以存到多少钱!
  5. python爬虫之美剧排行榜爬取(加浏览器伪装,代理,异常处理)
  6. 华为云GaussDB,11.11让企业无后顾之忧
  7. JDK1.8 中 ConcurrentHashMap源码分析(二)元素添加是线程安全的
  8. c++ mysql 写库 乱码 ??_mysql c++ 乱码 解决方法
  9. jquery的extend和fn.extend
  10. 2017-2018-1 20155202 《信息安全系统设计基础》第4周学习总结
  11. 介绍一个日志记录函数
  12. FPGA Vivado AXI _DMA IP介绍
  13. Linux下更改DNS地址
  14. 黑马程序员_源自梦想 GUI
  15. habor-deploy docker https 私有仓库搭建
  16. Javaweb和微信小程序项目部署阿里云服务器总结(上)
  17. 在指定数据的前面加“0“
  18. html5制作坦克大战
  19. 行业分析-全球与中国引风机市场现状及未来发展趋势
  20. Uber入驻四川乐山峨眉地区

热门文章

  1. 推荐一个不到300k的Gif处理神器 - Gifsicle(免费下载)
  2. 通过History Trends Unlimited通过统计服务器上Edge浏览器Top10网页历史访问量(2021.11.23)
  3. 第03课:Anaconda 与 Jupyter Notebook
  4. 如何解决pip更新问题
  5. es根据字段长度过滤_Es 根据数组长度查询
  6. python 空值_数据库中的空值与NULL的区别以及python中的NaN和None
  7. sqlserver查看跟某个表相关的所有存储过程
  8. go语言游戏编程-Ebiten使用矩阵实现对图的缩放和移动
  9. XCTF-Reverse:logmein
  10. 【又放洋屁了】文艺细菌发作了