360 笔试题2013 - 传教士与野人过桥问题
看2013年的试题最后一题是传教士与野人过桥问题,想着会只能想出模拟的方法,但是模拟的法子毕竟只适合脑经急转弯类的平时笑谈,写在试卷上终究是不太合适,所以上网搜了搜。网上有用的自动机(状态转换)那种的,一看就不是计算机科班出生,最好的法子就是写程序,迭代神马的计算机最喜欢做了,呵呵。。
明天就参加360的笔试了,真心求人品爆发!!
网上的代码不是很精准,我自己写了一套,貌似很完美,以下是一些截图:


#include<iostream> #include<vector> #include<string> using namespace std; bool flag=true; //"true" means left side vector<string> visit,step; /* author: Matthew Carroll / time: 10-10-2013 */ bool dfs(int M,int N,int m,int n) { char s[30]; if(M<0 || N<0 || m<0 || n<0) return false; if((M&&M<N)||(m&&m<n)) return false; if(!flag&&M==0&&N==0){ sprintf(s,"M=%d,N=%d,m=%d,n=%d,boat=right",M,N,m,n); visit.push_back(s); return true; } if(flag) sprintf(s,"M=%d,N=%d,m=%d,n=%d,boat=left",M,N,m,n); else sprintf(s,"M=%d,N=%d,m=%d,n=%d,boat=right",M,N,m,n); string str(s); for(int i=0;i<visit.size();i++) { if(visit[i]==str) return false; } visit.push_back(str); flag=!flag; if(!flag) { //assume the boat is in left side if(dfs(M-2,N,m+2,n)){ step.push_back("from left to right : 2 ,0\n"); return true; } else if(dfs(M-1,N-1,m+1,n+1)){ step.push_back("from left to right : 1,1\n"); return true; } else if(dfs(M,N-2,m,n+2)){ step.push_back("from left to right : 0,2\n"); return true; } else if(dfs(M-1,N,m+1,n)){ step.push_back("from left to right : 1,0\n"); return true; } else if(dfs(M,N-1,m,n+1)){ step.push_back("from left to right : 0,1\n"); return true; } } else{ //assume the boat is in left side if(dfs(M+1,N,m-1,n)){ step.push_back("from right to left : 1,0\n"); return true; } else if(dfs(M,N+1,m,n-1)){ step.push_back("from right to left : 0,1\n"); return true; } } flag=!flag; visit.pop_back(); return false; } int main() { int M,N,m=0,n=0; cout<<"Input the number of human and monster : "<<endl; cin>>M>>N; if(!dfs(M,N,m,n)) cout<<"Can't find the solution ! "<<endl; else{ cout<<"Start : "<<visit.at(0)<<endl<<endl; for(int i=0;i<step.size();i++) { cout<<"Step "<<i+1<<":"<<step.at(step.size()-1-i) ; cout<<"Result : "<<visit.at(i+1)<<endl<<endl; } } cin>>m; return 0; }

浙公网安备 33010602011771号