野人过河问题
来源:互联网 发布:怎么申请淘宝账号 编辑:程序博客网 时间:2024/05/16 01:47
这是某安全公司的笔试题,它的题目包括几十道选择题,和一道主观题,即野人过河问题。选择题涉及智力题、计算机组成原理、正则、C语言、操作系统等方面,而主观题,则是搜索中的经典题型。
野人过河问题题意如下:
有M个牧师(也有的翻译为传教士)和C个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的人数,那么牧师就会有危险. 你能不能找出一种安全的渡河方法呢(M>=C)?
可惜,在紧张的笔试过程中,我虽然想到了可能是搜索,但是,算法的不熟练导致我并不能够非常快速的将搜索算法写出来。估计笔试跪了,写出来,供后人参考吧。
其实就是五种状态:
1.两个野人过河
2.两个牧师过河
3.一个野人一个牧师过河
4.一个牧师过河
5.一个野人过河
只需对这5种状态进行搜索,直到得到问题的解,或者得到问题无解,搜索过程即终止。
代码如下:
#include<iostream>#include<string>#include<vector> using namespace std;vector<string> vect;bool boat = true;//true表示船在对岸 //用深度搜索的方法进行解答bool dfs(int m,int c,int M,int C){ char s[30]; //非法状态 if(m<0||c<0||M<0||C<0){ return false; } //野人多于传教士,传教士会被吃掉 if((m&&c>m)||(M&&C>M)){ return false; } //运送到了对岸 if((boat&&M==0&&C==0)||(!boat&&m==0&&c==0)){ return true; } if(boat==true){ sprintf(s,"M=%d,C=%d,m=%d,c=%d,boat=right",M,C,m,c); }else{ sprintf(s,"M=%d,C=%d,m=%d,c=%d,boat=left",M,C,m,c); } for(int i=0;i<vect.size();i++){ //如果此状态已存在过 if(vect[i]==s){ return false; } } //搜索五种状态 boat = !boat; vect.push_back(s); if(dfs(m+2,c,M-2,C)){ cout<<"两个传教士过河."<<endl; return true; }else if(dfs(m,c+2,M,C-2)){ cout<<"两个野人过河."<<endl; return true; }else if(dfs(m+1,c+1,M-1,C-1)){ cout<<"一个野人和一个传教士过河."<<endl; return true; }else if(dfs(m+1,c,M-1,C)){ cout<<"一个传教士过河."<<endl; return true; }else if(dfs(m,c+1,M,c-1)){ cout<<"一个野人过河."<<endl; return true; } boat = !boat; vect.pop_back(); return false; } int main() { //假设一种情况 int M=6,C=6,m=0,c=0; char s[30]; sprintf(s,"M=%d,C=%d,m=%d,c=%d,boat=left",M,C,m,c); cout<<s<<endl; if(!dfs(m,c,M,C)){ cout<<"can not find a solution."<<endl; } system("pause"); return 0; }
我是搞JAVA的,搞JAVA的非常苦逼。因为在笔试上爹不疼娘不爱的,大部分笔试是考C/C++基础,对于专注于JAVA的童鞋来说,必须要对C/C++进行复习,很痛苦的。建议能够搞C/C++还是搞C/C++吧!至少在笔试面试上是非常占优的。
- 传教士野人过河问题
- 野人过河问题
- 传教士 野人 过河问题
- 野人过河问题
- 野人过河问题
- 野人过河问题(一)
- 野人过河问题
- 野人传教士过河问题
- 传教士和野人过河问题
- c实现野人过河问题
- 野人与传教士过河问题
- 传教士野人过河问题---Java版本
- C++习题:野人与修道士过河问题
- 传教士与野人过河问题(一)
- 传教士与野人过河问题(二)
- Java实现传教士与野人过河问题
- 野人和传教士过河问题的C语言源代码
- 360面试题:传教士和野人过河问题。
- WCF服务器端和客户端配置说明
- 1555 how many days
- 重构笔记(一)——坏味道
- 黑马程序员-java基础常识
- hibernate一对多双向关联中怎么配置list
- 野人过河问题
- 黑客帝国或是真实的 科学家现能验证虚拟空间
- Buddy算法实现
- 龙应台祝贺莫言获诺奖:好家伙你得奖了-莫言-诺贝尔文学奖-龙应台
- 重构笔记(二)——重构方法
- TCP连接的终止过程
- 黑马程序员__高新技术1
- 重构笔记(三)——eclipse的支持
- 经典ORACLE面试题目