附:增加源碼下載地址-----------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永遠是優先回來) 這樣 所浪費的時間是最少 也就是最優的過橋方案
源碼:

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 }

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:我本來想上傳打包源碼 發現找不到上傳按鈕...
如果這篇文章能夠給與您幫助 不妨點個推薦吧!