逻辑题:假设河的同一侧有警察、强盗……
来源:互联网 发布:上海聚友网络客服电话 编辑:程序博客网 时间:2024/04/28 10:02
假设河的同一侧有警察、强盗、路人A、路人A的两个孩子(A1,A2)、路人B、路人B的两个孩子(B1、B2),他们想要安全过河,限制条件如下:
1、假设警察不在,强盗会杀死所有的跟他在一起的人
2、假设路人A离开,路人B和路人A的孩子在一起,路人A的孩子会死掉
3、假设路人B离开,路人A和路人B的孩子在一起,路人B的孩子会死掉
4、河面上有一条船,但一次最多可以容纳两人过河
5、只有警察、路人A、路人B会划船
请给出你的过河方案。
#include <bits/stdc++.h>using namespace std;struct state{int l[8];int r[8];int boat;state(){for (int i=0;i<8;i++)l[i]=1;memset(r,0,sizeof(r));boat=0;}};bool ok(state s){bool flag=true;for (int i=0;i<8;i++)if (!s.r[i]){flag=false;break;}return flag;}bool valid(state s){bool flag=true;//left validif (!s.l[0] && s.l[1] && (s.l[2]||s.l[3]||s.l[4]||s.l[5]||s.l[6]||s.l[7]))flag=false;if (s.l[2] && !s.l[5] && s.l[6] && s.l[7])flag=false;if (s.l[5] && !s.l[2] && s.l[3] && s.l[4])flag=false;//right validif (!s.r[0] && s.r[1] && (s.r[2]||s.r[3]||s.r[4]||s.r[5]||s.r[6]||s.r[7]))flag=false;if (s.r[2] && !s.r[5] && s.r[6] && s.r[7])flag=false;if (s.r[5] && !s.r[2] && s.r[3] && s.r[4])flag=false;return flag;}const char str[][100]={"警察","强盗","A","A1","A2","B","B1","B2"};string path[100];bool found=false;map<string, bool> M;string toString(state s){string temp;for (int i=0;i<8;i++){temp+=s.l[i]+'0';temp+=s.r[i]+'0';}temp+=s.boat+'0';//cout << temp << endl;return temp;}void dfs(state s,int depth){if (M[toString(s)]) return;if (found) return;if (!valid(s)) return;if (ok(s)){for (int i=0;i<depth;i++){if (i%2==0)cout << "left --> right : ";elsecout << "left <-- right : ";cout << path[i] << endl;}cout << "DONE" << endl;found=true;return;}M[toString(s)]=true;if (!s.boat)//left{if (s.l[0]){state newState=s;newState.boat=s.boat^1;newState.l[0]=0;newState.r[0]=1;path[depth]=str[0];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=0 && s.l[i]){state newState=s;newState.boat=s.boat^1;newState.l[i]=newState.l[0]=0;newState.r[i]=newState.r[0]=1;path[depth]=str[0];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}if (s.l[2]){state newState=s;newState.boat=s.boat^1;newState.l[2]=0;newState.r[2]=1;path[depth]=str[2];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=2 && s.l[i]){state newState=s;newState.boat=s.boat^1;newState.l[i]=newState.l[2]=0;newState.r[i]=newState.r[2]=1;path[depth]=str[2];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}if (s.l[5]){state newState=s;newState.boat=s.boat^1;newState.l[5]=0;newState.r[5]=1;path[depth]=str[5];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=5 && s.l[i]){state newState=s;newState.boat=s.boat^1;newState.l[i]=newState.l[5]=0;newState.r[i]=newState.r[5]=1;path[depth]=str[5];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}}else//right{if (s.r[0]){state newState=s;newState.boat=s.boat^1;newState.r[0]=0;newState.l[0]=1;path[depth]=str[0];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=0 && s.r[i]){state newState=s;newState.boat=s.boat^1;newState.r[i]=newState.r[0]=0;newState.l[i]=newState.l[0]=1;path[depth]=str[0];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}if (s.r[2]){state newState=s;newState.boat=s.boat^1;newState.r[2]=0;newState.l[2]=1;path[depth]=str[2];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=2 && s.r[i]){state newState=s;newState.boat=s.boat^1;newState.r[i]=newState.r[2]=0;newState.l[i]=newState.l[2]=1;path[depth]=str[2];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}if (s.r[5]){state newState=s;newState.boat=s.boat^1;newState.r[5]=0;newState.l[5]=1;path[depth]=str[5];dfs(newState,depth+1);for (int i=0;i<8;i++)if (i!=5 && s.r[i]){state newState=s;newState.boat=s.boat^1;newState.r[i]=newState.r[5]=0;newState.l[i]=newState.l[5]=1;path[depth]=str[5];path[depth]+=" ";path[depth]+=str[i];dfs(newState,depth+1);}}}}int main(){state init;dfs(init,0);}
0 0
- 逻辑题:假设河的同一侧有警察、强盗……
- 挺可爱的强盗
- HihoCoder 1252 Kejin Game(最小割+点在割的一侧有花费建图)
- 一侧ora-4030 的分析
- 杀人游戏2.0版本(有警察)的规则
- 我在银行钱被抢的经历,中国有个强盗叫“银行”
- 医生和强盗还是有很大区别
- 假设每磁道划分成10个物理块,每块存放1个逻辑记录。逻辑记录R1,R2,…
- 假设在n进制下,下面的等式成立,5…
- 5个强盗的博弈论
- 题解分析及总结:经典逻辑面试题“假设有一个池塘,里面有无穷多的水,现有2个空水壶,如何使用少于15L的水,用2个水壶从池塘里取得3升水”
- 为什么机器学习中, 要假设我们的数据是独立同分布的
- 又撞警察了……
- 让splitContainer的一侧容器宽度不变
- 一侧空格引起的小故事
- 假设有50瓶饮料,
- 发几个逻辑题 后面有我的分析 嘿嘿~~
- 同余方程组有解的条件
- 如何在vs2012和2013中,为项目引入sqlite linq2db,以及C#操作sqlite的基本知识。
- Android View的ScrollBar
- R.java was modified manually! Reverting to generated version!
- 说说内存泄露那点事
- 想跳槽?离职前务必做好8件事
- 逻辑题:假设河的同一侧有警察、强盗……
- ubuntu下创建数据库的常用命令,及流程,以及sql脚本文件格式
- App开发日报 2015-04-09
- escape()、encodeURI()、encodeURIComponent()区别详解
- win7 无法在同一窗口打开文件夹
- java的基础知识
- 不容错过!开发者必备的十二大Android开发资源
- android中通过自定义xml实现shape效果 的属性配置
- 日期显示