最短時間過橋問題


 

附:增加源碼下載地址-----------http://files.cnblogs.com/yeguo/Console.zip

問題如下:四個女人過橋,夜間有一火把,每次最多過兩個,必需帶火把,過橋速度不一樣,分別為

  • no.1 1min
  • no.2 2min
  • no3 5min
  • no.4 10min

        兩個人過用最慢一個的速度,火把不能扔,如何在17min內四個女人都過橋?

 

 

這個問題其實園子里已經有解決方案了 也討論了多次 不過呢 很多只有思路 源碼也不夠詳細 於是 我再演繹一下 歸納總結一下

其實是很簡單的  返回永遠最多返回一個 所以返回肯定是取已經過橋的人中時間最短的那一個

那么過橋呢 過橋的話 要么取時間最短的兩個(最快速)  要么取最慢的兩個(最不浪費快的那個人的時間)  而取最慢的兩個過橋的前提是:已經過橋的人中,存在一個人,速度比未過橋的人快 (其實這個人 永遠就是no.2  因為no.2永遠和no.1一起過橋 而no.1永遠是優先回來)  這樣 所浪費的時間是最少 也就是最優的過橋方案

源碼:

View Code
  1   internal class Women
  2     {
  3         /// <summary>
  4         /// 左邊未過橋人集合
  5         /// </summary>
  6         private List<int> leftListWomen = new List<int>();
  7         /// <summary>
  8         /// 右邊已過橋人集合
  9         /// </summary>
 10         private List<int> rightListWomen = new List<int>();
 11         /// <summary>
 12         /// 已過人數
 13         /// </summary>
 14         private int alreadyNum = 0;
 15         /// <summary>
 16         /// 應過人數
 17         /// </summary>
 18         private int shouldNum = 0;
 19         /// <summary>
 20         /// 共用時
 21         /// </summary>
 22         private int sumTime = 0;
 23 
 24         public Women(params int[] speed)
 25         {
 26             foreach (var item in speed)
 27             {
 28                 leftListWomen.Add(item);
 29                 shouldNum++;
 30             }
 31         }
 32         /// <summary>
 33         /// 是否已完成過橋
 34         /// </summary>
 35         private bool IsComplete
 36         {
 37             get
 38             {
 39                 return alreadyNum == shouldNum;
 40             }
 41         }
 42         /// <summary>
 43         /// 開始過橋
 44         /// </summary>
 45         /// <returns></returns>
 46         public string StartGapBridge()
 47         {
 48             string msg = string.Empty;
 49             while (!IsComplete)
 50             {
 51                 if (leftListWomen.Count >= 2)
 52                 {
 53                     //送大的過橋
 54                     if (IsRightWomenLessLeft())
 55                     {
 56                         leftListWomen.Sort();
 57                         msg += "過橋:" + leftListWomen[leftListWomen.Count - 1] + "" + leftListWomen[leftListWomen.Count - 2] + Environment.NewLine;
 58                         sumTime += leftListWomen[leftListWomen.Count - 1];
 59                         rightListWomen.Add(leftListWomen[leftListWomen.Count - 1]);
 60                         rightListWomen.Add(leftListWomen[leftListWomen.Count - 2]);
 61                         leftListWomen.RemoveAt(leftListWomen.Count - 1);
 62                         leftListWomen.RemoveAt(leftListWomen.Count - 1);
 63                         alreadyNum = alreadyNum + 2;
 64                         if (!IsComplete)
 65                         {
 66                             //返回
 67                             rightListWomen.Sort();
 68                             msg += "返回:" + rightListWomen[0] + Environment.NewLine;
 69                             sumTime += rightListWomen[0];
 70                             leftListWomen.Add(rightListWomen[0]);
 71                             rightListWomen.RemoveAt(0);
 72                             alreadyNum--;
 73                         }
 74                     }
 75                     else
 76                     {
 77                         leftListWomen.Sort();
 78                         msg += "過橋:" + leftListWomen[0] + "" + leftListWomen[1] + Environment.NewLine;
 79                         sumTime += leftListWomen[1];
 80                         rightListWomen.Add(leftListWomen[0]);
 81                         rightListWomen.Add(leftListWomen[1]);
 82                         leftListWomen.RemoveAt(0);
 83                         leftListWomen.RemoveAt(0);
 84                         alreadyNum = alreadyNum + 2;
 85                         if (!IsComplete)
 86                         {
 87                             //返回
 88                             rightListWomen.Sort();
 89                             msg += "返回:" + rightListWomen[0] + Environment.NewLine;
 90                             sumTime += rightListWomen[0];
 91                             leftListWomen.Add(rightListWomen[0]);
 92                             rightListWomen.RemoveAt(0);
 93                             alreadyNum--;
 94                         }
 95                     }
 96                 }
 97             }
 98             return msg + "共用時:" + sumTime;
 99         }
100 
101         /// <summary>
102         /// 是否右邊女人的速度有比左邊快的
103         /// </summary>
104         /// <returns></returns>
105         private bool IsRightWomenLessLeft()
106         {
107             foreach (int rightSpeed in rightListWomen)
108             {
109                 foreach (int leftSpeed in leftListWomen)
110                 {
111                     if (leftSpeed > rightSpeed)
112                     {
113                         return true;
114                     }
115                 }
116             }
117             return false;
118         }
119 
120     }
View Code
1   static void Main(string[] args)
2         {
3 
4             Women w1 = new Women(1, 2, 5, 10);
5             Console.WriteLine(w1.StartGapBridge());
6             Console.Read();
7         }


ps:我本來想上傳打包源碼 發現找不到上傳按鈕...

 

如果這篇文章能夠給與您幫助 不妨點個推薦吧!

 

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM