野人与传教士

 

/*
 问题描述:设有三个传教士和三个野人来到河边,打算乘一只船从右
 岸渡到左岸去。该船最大负载能力为两人,在任何时候,如果野人人数超过传教士
 人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过
 河去呢?

*/

问题比较有趣,写了一下,比较繁琐些:


  1. #include<iostream>
  2. using namespace std;
  3. int Right_Balance;//右岸的传教士与野人的平衡情况
  4. int count=0;//可能的渡河方法数
  5. struct Load{
  6.  int Passenger;
  7.  int Shipman;
  8. };
  9. Load Notes[5];//应该走5趟
  10. int main(){
  11.  void Travel(int n);
  12.  void Init();//初始化各参数
  13.  Init();
  14.  Travel(0);
  15.  cout<<"可能的渡河方法为:"<<count<<endl;
  16.     return 0;
  17. }
  18. void Init(){
  19.  Right_Balance=0;
  20.  for(int i=0;i<5;i++){
  21.   Notes[i].Passenger=0;
  22.   Notes[i].Shipman=0;
  23.  }
  24. }
  25. void Travel(int n){
  26.  if(n==5){//输出
  27.   for(int i=0;i<5;i++){
  28.    cout<<"第"<<i+1<<"趟:"<<endl;
  29.             cout<<"划船者为:";
  30.             if(Notes[i].Shipman==-1)cout<<"野人";
  31.    else cout<<"传教士";
  32.    cout<<endl;
  33.    cout<<"到左岸者为:";
  34.             if(Notes[i].Passenger==-1)cout<<"野人";
  35.    else cout<<"传教士";
  36.    if(i==4){
  37.     if(Notes[i].Shipman==-1)cout<<" 野人";
  38.     else cout<<" 传教士";
  39.    }
  40.    cout<<endl;
  41.   }
  42.   cout<<"*******************"<<endl;
  43.   count++;
  44.   return ;
  45.  }
  46.  else{//从右岸中选出两个人来渡河
  47.   if(n==0){//第一趟,至少要有一个野人上船
  48.    Right_Balance+=2;//两个野人上船
  49.    Notes[n].Passenger=-1;
  50.    Notes[n].Shipman=-1;
  51.    Travel(n+1);
  52.             //一个传教士一个野人上船,两种情况
  53.    Right_Balance=0;
  54.             Notes[n].Passenger=-1;//野人先过
  55.    Notes[n].Shipman=1;
  56.    Travel(n+1);
  57.    Right_Balance=0;//传道士先过
  58.    Notes[n].Passenger=1;
  59.    Notes[n].Shipman=-1;
  60.    Travel(n+1);
  61.            
  62.   }
  63.   else{
  64.    if(Right_Balance>0){ //传教士较多,此时船上的只能是野人
  65.                 Right_Balance--;//选择一个传教士并且作为乘客
  66.     Notes[n].Passenger=1;
  67.     Notes[n].Shipman=-1;
  68.     Travel(n+1);
  69.     
  70.    }
  71.    else{
  72.                 Right_Balance++;//必须选择一个野人
  73.     if(Notes[n-1].Shipman==-1){//船上的为野人
  74.      Notes[n].Passenger=-1;
  75.      Notes[n].Shipman=-1;
  76.      Travel(n+1);
  77.     }
  78.     else{//船上的为传道士
  79.                     Notes[n].Passenger=1;
  80.      Notes[n].Shipman=-1;
  81.         Travel(n+1);
  82.     }
  83.    }
  84.   }
  85.  }
  86. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值