加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

牧师野人过河算法

(2012-11-14 09:51:47)
标签:

杂谈

分类: C/C
这也是一个牧师野人过河问题的算法,问题在上一篇博文中有,就一再描述了,这个算法只考虑单向,比较容易理解,以下是算法代码:
#include
#include
#include 
using namespace std;
vector 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=left",M,C,m,c);// 把当前状态存放在s内           
     }else{
     
           sprintf(s,"M=%d,C=%d,m=%d,c=%d,boat=right",M,C,m,c); //把当前状态存放在s内     
     
     
     for(int i=0;i
     
             //如果此状态已存在过 
             if(vect[i]==s){
             
                            return false;               
             }        
     
     
     //搜索五种状态
     boat = !boat;
     vect.push_back(s); //把s存放在vect中
     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;    

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有