[2015KPMG毕马威笔试经验]先说一下我背景吧,我是上海复旦大学旁边的某个知名财经大学的学生,专业是工商管理,成绩一般般,在工商管理班是属于倒数的,不过放到年级上就是前30%的水平,所以填成绩排名时从来只...+阅读
编程题、传教士人数M,野人C,MC,开始都在岸左边,
①船只能载两人,传教士和野人都会划船,当然必须有人划船
②两岸边保证野人人数不能大于传教士人数
把所有人都送过河,设计一方案,要求编程实现。
思路:
深度搜索。
状态:左岸和右岸的人数+船的位置。
每一个状态下,会有5种状态可以转移,
即:
1,运送2个传教士到对岸;
2,运送2个野人到对岸;
3,运送1个传教士到对岸;
4,运送1个野人到对岸;
5,运送1个传教士和一个野人到对岸。
从初始状态开始搜,搜索这五种情况,
进入下一状态,判断该状态是否满足条件,
即两岸野人的个数是否比该岸的传教士多,
如果满足条件,则继续搜索该状态下的五种情况。
深度搜索下去,直到找到最后的解。
注意:
1,如果搜索的状态在之前已经出现过了,就不深入下去了,
否则会出现死循环,比如运两个野人过去,再运回来,状态复原了,
如果一直这么搜下去,就没玩没了了。
2,状态包括船的信息,如果两边的人数都是一样,但是船的位置不一样,
那么这是两种状态。
3,要搜索的目标状态是人都在对岸且船在对岸。
PS:
当M=C3时,没有解。
当MC时,有解。
[cpp] view plaincopyprint?
#include
#include
#include
#include
using namespace std;
bool flag = true; true:表示在右岸
vectorvisit; 记录已经访问过的状态
bool dfs( int M, int C, int m, int c){
if( M0||C0||m0||c0) 非法
return false;
if( (MCM) ||(mcm)) 野人会吃牧师
return false;
if( flagM==0C==0 ||(!flagm==0c==0)) 全部运输过去
return true;
检查该节点是否出现过
char s[30];
if( !flag )
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=left, M,C,m,c);
else
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=right, m,c,M,C);
string str(s);
for( int i=0; i
if( visit[i]==str) 该状态已经搜索过了
return false;
visit.push_back(str);
flag = !flag;
if( dfs( m+2, c, M-2,C) ){
printf(2,0\n);
printf(%s\n,s);
return true;
}
else if( dfs( m, c+2, M, C-2) ){
printf(0,2\n);
printf(%s\n,s);
return true;
}
else if( dfs( m+1, c+1, M-1, C-1) ){
printf(1,1\n);
printf(%s\n,s);
return true;
}
else if( dfs( m+1, c, M-1, C)){
printf(1,0\n);
printf(%s\n,s);
return true;
}
else if( dfs( m, c+1, M, C-1)){
printf(0,1\n);
printf(%s\n,s);
return true;
}
flag = !flag;
visit.pop_back();
return false;
}
int main(){
char s[30];
int M=6,C=6,m=0,c=0;
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=left, M,C,m,c);
printf(%s\n,s);
if(!dfs(M,C,0,0))
cout Can not find the solution.
return 0;
}
#include
#include
#include
#include
using namespace std;
bool flag = true; true:表示在右岸
vectorvisit; 记录已经访问过的状态
bool dfs( int M, int C, int m, int c){
if( M0||C0||m0||c0) 非法
return false;
if( (MCM) ||(mcm)) 野人会吃牧师
return false;
if( flagM==0C==0 ||(!flagm==0c==0)) 全部运输过去
return true;
检查该节点是否出现过
char s[30];
if( !flag )
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=left, M,C,m,c);
else
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=right, m,c,M,C);
string str(s);
for( int i=0; i
if( visit[i]==str) 该状态已经搜索过了
return false;
visit.push_back(str);
flag = !flag;
if( dfs( m+2, c, M-2,C) ){
printf(2,0\n);
printf(%s\n,s);
return true;
}
else if( dfs( m, c+2, M, C-2) ){
printf(0,2\n);
printf(%s\n,s);
return true;
}
else if( dfs( m+1, c+1, M-1, C-1) ){
printf(1,1\n);
printf(%s\n,s);
return true;
}
else if( dfs( m+1, c, M-1, C)){
printf(1,0\n);
printf(%s\n,s);
return true;
}
else if( dfs( m, c+1, M, C-1)){
printf(0,1\n);
printf(%s\n,s);
return true;
}
flag = !flag;
visit.pop_back();
return false;
}
int main(){
char s[30];
int M=6,C=6,m=0,c=0;
sprintf( s, M=%d,C=%d,m=%d,c=%d,boat=left, M,C,m,c);
printf(%s\n,s);
if(!dfs(M,C,0,0))
cout Can not find the solution.
return 0;
}
延伸阅读:
公务员面试观点类题目回答技巧观点类问题的共性是都涉及到对观点的看法,我们把观点类问题分为单观点、双观点和多观点三类。那么首先,考生要明确观点的含义和内容,进而明确观点的意义和价值,并能通过语言把自...
2015重庆移动校招笔试经验重庆移动重庆地区的校招终于是告一段落了,今天刚好闲下来,想想移动校招这一路走来,还是有所收获,自己也是从前辈的帖子获取了很多信息,所以在这里也跟大家分享下自己一路走来的经...
2015天职国际网测笔试经验我坐标南京,非211非965学校,投的也是南京所。一直很中意天职国际,实习的时候和天职是同一座大厦,那时候就很希望能去楼上工作,所以宣讲会的话特地从江宁跑去浦口去听,还算幸运,简历...
2015中国银行笔试经验分享今年中行笔试时间好早啊!是所有银行中最早的一个了,楼主之前准备了两个月,今天考完的感觉就是、、、都白看了= =超级难!好吧可能有些复习的好的觉得还行吧,废话不多说,直接上。...
衣恋2014笔试经验30日晚广州在中大笔试。 什么文具用品都不用带,现场会发(其实只有一支笔而已,要用修正带可以跟工作人员借)。 hr一上来就跟我们说,这次笔试非常难,甚至有人一道题都做不对什么的...
安永2014年笔试经验分享关于考几道 怎么考 时间巴拉巴拉的就不赘述了 就简单说一下我记得的题目吧 Verbal 比较多以下哪个正确或者以下哪个错误的题目 比较麻烦 难度递增 一篇文章2道题 1. GPS定位...
欢聚时代2017校招产品经理笔试经验今年的笔试是在华工五山校区举行的,风尘仆仆的从大学城赶过去啊!去了之后按照短信的通知找教室,教室里有笔试技术的也有笔试产品的,没有固定位置,但按照一列技术类一列非技术类...
中行2015校园招聘笔试经验我2014年11月1日下午1点30到4点30参加了中国银行2015校招笔试,上午在仙林南邮参加江苏电信笔试,2个小时的时间内赶到了江宁南医参加了中行的考试。以下是考试内容和时间段,都是...
笔试的几个面试技巧笔试的几个面试技巧1.科学答卷拿到试卷后,首先应通览一追,了解题目的多少和难易程度,以便掌握答题的速度,然后根据先易后难的原则排出答题的顺序、先攻相对简单的题,后攻难题。这...