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;
}

 

posted @ 2013-10-12 00:18  扶-苏  阅读(461)  评论(0)    收藏  举报