过桥问题

来源:互联网 发布:java int super 编辑:程序博客网 时间:2024/04/19 12:20
Code:
  1. #include <iostream>   
  2. using namespace std;   
  3.   
  4. const int N = 5;   
  5.     
  6. const int  SIZE = (N - 2) * 3 + 2;   
  7.   
  8. // 将人员编号:小明-0,弟弟-1,爸爸-2,妈妈-3,爷爷-4   
  9. // 每个人的当前位置:0--在桥左边, 1--在桥右边   
  10. int Position[N] = {0};       
  11.   
  12. // 过桥临时方案的数组下标; 临时方案; 最小时间方案;    
  13. int Index, TmpScheme[SIZE], Scheme[SIZE];      
  14.   
  15. // 最小过桥时间总和,初始值100;每个人过桥所需要的时间   
  16. int MinTime=100, Time[N]={1, 3, 6, 8, 12};     
  17.   
  18. // 寻找最佳过桥方案。Remnant:未过桥人数; CurTime:当前已用时间;    
  19. // Direction:过桥方向,1--向右,0--向左   
  20. void Find(int Remnant, int CurTime, int Direction)    
  21. {   
  22.    if (Remnant == 0)   
  23.  {   
  24.    MinTime = CurTime;   
  25.   for (int i = 0; i < SIZE; ++i)    
  26.   {   
  27.    Scheme[i] = TmpScheme[i];   
  28.   }   
  29.   }   
  30.   else if (Direction == 1)   
  31.   {   
  32.    for (int i = 0; i < N; ++i)   
  33.    {   
  34.     if (Position[i] == 0 && CurTime + Time[i] < MinTime)   
  35.     {   
  36.      TmpScheme[Index++] = i;   
  37.      Position[i] = 1;   
  38.      for (int j = 0; j < N; ++j)   
  39.      {   
  40.       int TmpMax = (Time[i] > Time[j] ? Time[i] : Time[j]);   
  41.       if (Position[j] == 0 && CurTime + TmpMax < MinTime)   
  42.       {   
  43.        TmpScheme[Index++] = j;       
  44.                         Position[j] = 1;    
  45.        Find(Remnant-2, CurTime + TmpMax, !Direction);   
  46.        TmpScheme[--Index] = -1;       
  47.                         Position[j] = 0;    
  48.       }   
  49.      }   
  50.      TmpScheme[--Index] = -1;       
  51.         Position[i] = 0;    
  52.     }   
  53.    }   
  54.   }   
  55.   else  
  56.   {   
  57.    for (int i = 0; i < N; ++i)   
  58.    {   
  59.     if (Position[i] == 1 && CurTime + Time[i] + Time[i] < MinTime)   
  60.     {   
  61.      TmpScheme[Index++] = i;   
  62.      Position[i] = 0;   
  63.      Find(Remnant + 1, CurTime + Time[i], !Direction);   
  64.      Position[i] = 1;   
  65.      TmpScheme[--Index] = -1;   
  66.     }   
  67.    }   
  68.   }   
  69. }   
  70. int main(int argc, char* argv[])    
  71. {   
  72.  int i;   
  73.     for(i=0; i<SIZE; i++)   // 初始方案内容为负值,避免和人员标号冲突   
  74.         Scheme[i] = TmpScheme[i] = -1;   
  75.            
  76.  Find(N, 0, 1);        // 查找最佳方案   
  77.     
  78.     cout << "MinTime=:" << MinTime << endl; // 输出最佳方案   
  79.     for(i=0; i<SIZE - 2; i+=3)   
  80.     {   
  81.         cout << Scheme[i] << "-" << Scheme[i+1] << "  " << Scheme[i+2] << endl;   
  82.     }   
  83.     cout << Scheme[i+1] << "-"  << Scheme[i + 2] <<endl;   
  84.            
  85.     return 0;   
  86. }   
  87.