某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:
和尚1: 星期二,四;
和尚2: 星期一,六;
和尚3: 星期三,日;
和尚4: 星期五;
和尚5: 星期一,四,六;
和尚6: 星期二,五;
和尚7: 星期三,六,日;
请将所有合理的挑水时间安排表 。
输入为每个和尚从周一到周日的空闲情况,输出则为所有可能的任务安排表。
这道题用到了回溯法(backtracking),它的基本思想如下:
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
在本题中,每一种挑水策略为一个解,可从星期一开始,先选择一个空闲的和尚(如和尚1),接着到星期二再选一个和尚(空闲且非和尚1),接着依次类推直到星期日选完和尚,如果中途某天没有满足要求的和尚,则放弃该解。在每天选和尚时,都有(该天空闲和尚数-已挑过水的和尚数)种选择,通过穷举的方法,可以不断将解的范围扩大,直到遍历所有解。
下面给出具体代码:
#include <iostream>
using namespace std;
struct st
{int isFree[7];   //和尚某天是否空闲(1为空闲)bool haveWorked; //在一次解法中是否挑过水(1为挑过水)
}monk[7];int sum;       //方案总数
int x[7]={0};  //具体方案数组,1表示挑水,0表示不挑水void backtrack(int n)
{int i=0;if(n==7)   //得到一组解并输出{sum++;cout<<"第"<<sum<<"种方案:"<<endl;for(i=0;i<7;i++)cout<<x[i]<<' ';cout<<endl;}else{for(i=1;i<=7;++i){if(monk[i-1].isFree[n]==1&&monk[i-1].haveWorked==false) //和尚i没有挑过水且在星期n有时间{x[n]=i;monk[i-1].haveWorked=true;backtrack(n+1);monk[i-1].haveWorked=false;}}}
}
int main()
{int b[7][7]={{1,0,0,1,0,1,0},{0,0,1,1,0,0,0},{0,1,0,0,1,0,1},{1,1,0,0,0,1,0},\{0,0,1,0,1,0,0},{0,0,0,1,0,0,1},{1,0,0,0,1,0,0}};int i,j;for(i=0;i<7;++i)    //状态初始化{for(j=0;j<7;++j)monk[i].isFree[j]=b[i][j];monk[i].haveWorked=false;}backtrack(0);return 0;
}

[回溯法] 和尚挑水问题-华为笔试相关推荐

  1. 每天小练笔10-小和尚挑水(回溯法)

    每天小练笔10-小和尚挑水(回溯法) 题目 某寺庙里7个和尚:轮流挑水.为了和其它任务不能冲突.各人将有空天数列出例如以下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; ...

  2. 和尚挑水安排(回溯问题)

    题意:总共7个和尚,编号从1到7,星期的编号也是1到7,在一个星期中每个和尚在固定的某一天或几天挑水,求所有安排方案,使得每个和尚在一个星期中都有且仅有在其中某一天挑水. 举例: 和尚1 在星期2和星 ...

  3. [华为机试真题][2015]65.和尚挑水

    题目 某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四, ...

  4. 滴滴笔试毕业旅行——回溯法(dfs)

    题目: 题目描述: 小滴正在筹划他的毕业旅行.他打算去找他的外国网友们,首先第一站是法国巴黎,但是去巴黎的路线有很多,交通工具也有很多可供选择.现在有一个结点数为n,边的条数为m的无向图表示小滴到巴黎 ...

  5. 基本算法-回溯法(迷宫问题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 本文介绍一种经典算法--回溯法,可作为迷宫问题的一种解法,以下是本篇文章正文内容,包括算法 ...

  6. 2020.9.9华为笔试记忆:KMP+记忆化搜索+字典树

    2020.9.9华为笔试 当然,出现在我博客中的笔试都不是我自己的笔试(人家也不给我发笔试链接,小声bibi,诶,好像我也没投,hhhahahha 记者:为什么要做笔试? 我:生活无聊了喏,肯定要做啊 ...

  7. 【2019华为笔试】召唤师的技能——圆排列,翻转和项链排列

    题目描述: dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合产生新的技能.现在我们修改了张新的地图, 地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过 ...

  8. 算法设计与分析第5章 回溯法(二)【回溯法应用】

    第5章 回溯法 5.2 应用范例 1.0-1背包问题 有n件物品和一个容量为c的背包.第i件物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和 ...

  9. 算法设计与分析第5章 回溯法(一)【回溯法】

    第5章 回溯法 5.1 回溯法 1.回溯法的提出  有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法. 2. 问题的解空间 (1)问题的解向量:回溯法希望 ...

最新文章

  1. Asp.NetCore MVC Web 应用
  2. Hadoop_计算框架MapReduce
  3. [04-05]box框模型(Box Model)定义了元素框处理元素内容、内边距、边框和外边距的方式...
  4. th:each嵌套_难题:嵌套的computeIfAbsent
  5. B. Mashmokh and ACM
  6. 依赖注入有点_一文读懂Java控制反转(IOC)与依赖注入(DI)
  7. Updatepanel 注册javascript 方法
  8. Python 开发学习路线
  9. UVA10852 Less Prime【筛选法】
  10. Oracle从入门到精通
  11. NVivo 12 Mac的大规模部署
  12. Unity3D游戏制作学习记录03——丛林战争
  13. uboot研读笔记 | 13 - uboot编译构建Makefile分析研读(2016.03版本)
  14. 第二章 MATLAB数据与矩阵
  15. video视频相关问题:火狐浏览器报错“没有找到支持的视频格式和MIME类型”
  16. Windows运行Nacos
  17. IPA进军城市大脑丨实在智能与银江技术达成战略合作
  18. Java“彭于晏,kafka教程
  19. C语言计算点到直线的距离
  20. 计算机管理蓝屏不重启,win10系统怎么设置蓝屏后不自动重启

热门文章

  1. 屏幕分辨率:聊一聊像素
  2. 怎么加入到开源社区,开心做开源
  3. 用 Python 实现手机自动答题,这下百万答题游戏谁也玩不过我!
  4. 《校园宿舍管理系统》之数据库程序设计/GUI/java/eclipse/MySQL/JDBC
  5. Cytoskeleton——SiR-肌动蛋白相关工具推荐
  6. 去法国,买哪些伴手礼既有面子又不破费
  7. 2018 IROS,这款来自韩国的双臂机器人不容小觑!
  8. 【技术分享】甲骨文首约DTCC 大秀数据库技术创新
  9. [推荐]资金计划与预算的联系与区别
  10. STM VCP移植笔记