看到一個小學四年級的數學題,說是一共4個人過橋,分別單獨過橋用時3,4,6,9分鐘,該橋每次只能過兩個人,且每次過去之後必須要一個人回去接人,問四個人全部過去的最短時間。
真實題目確實很長,我不知道小學生遇到這個問題能否耐心讀完讀懂該問題。
所以我覺得題目確實蠻有意思的,有點腦筋急轉彎的感覺。
如果靜下心來解決,用排除法也能很快得到答案。
另外用Javascript窮盡法也能得到答案,網上還有人問js怎麼寫。
能力有限,用的比較死板的解決辦法,應該有大神有更好的解決辦法。
/// <reference path="jquery-1.10.2.js" /> $(document).ready(function () { $('#CrossBridge').html(); HowToCrossBridge(3, 4, 6, 9); }); /** //console.log("第一次過橋由" + firstGo1 + "和" + firstGo2 + "過,共計" + firstGo2 + "分鐘"); //document.writeln("第一次過橋由" + firstGo1 + "和" + firstGo2 + "過,共計" + firstGo2 + "分鐘"); 知識點: 1.數組的copy 注意區分深拷貝和淺拷貝 array.slice(0)以及array.concat() 2.數組的remove和push以及sort **/ function HowToCrossBridge(a, b, c, d) { var totalTime1 = 0; var breakFlag = true; var str1 = ""; var count = 0; var minTime = 0; var minStr = ""; //while (breakFlag) { //totalTime1 = 0; var waitingCross = [a, b, c, d]; var hadCrossed = new Array(); waitingCross = waitingCross.sort(function (a, b) { return a - b });//按順序從小到大排序 //第一次過橋(過去2人,剩餘2人) for (var i = 0; i < 4; i++) { for (var j = i + 1; j < 4; j++) { //count += 1; totalTime1 = 0; var hadCrossed1 = hadCrossed.concat(); var waitingCross1 = waitingCross.concat(); var firstGo1 = waitingCross1[i]; var firstGo2 = waitingCross1[j]; totalTime1 = totalTime1 + firstGo2; str1 = "<p>第一次過橋由" + firstGo1 + "和" + firstGo2 + "過,共計<fond style='color:red'>" + firstGo2 + "</fond>分鐘,合計<fond style='color:red'>" + totalTime1 + "</fond>分鐘</p>"; //移除等待過橋人員 waitingCross1.remove(firstGo1); waitingCross1.remove(firstGo2); waitingCross1.sort(function (a, b) { return a - b }); //添加已過橋人員 hadCrossed1 = [firstGo1, firstGo2]; hadCrossed1.sort(function (a, b) { return a - b }); str1 += "<p>第一次過橋後 hadCrossed=" + hadCrossed1.join() + " waitingCross=" + waitingCross1.join() + "</p>"; //第二次返回(過去1人,剩餘3人) for (var k = 0; k < 2; k++) { //count += 1; var hadCrossed2 = hadCrossed1.concat(); var waitingCross2 = waitingCross1.concat(); var str2 = str1; var totalTime2 = totalTime1; var secondBack = hadCrossed2[k]; totalTime2 = totalTime2 + secondBack; str2 += "<p>第二次返回由" + secondBack + "過,共計<fond style='color:red'>" + secondBack + "</fond>分鐘,合計<fond style='color:red'>" + totalTime2 + "</fond>分鐘</p>"; //添加等待過橋人員 waitingCross2.push(secondBack); waitingCross2.sort(function (a, b) { return a - b }); //移除已過橋人員 hadCrossed2.remove(secondBack); hadCrossed2.sort(function (a, b) { return a - b }); str2 += "<p>第二次返回後 hadCrossed=" + hadCrossed2.join() + " waitingCross=" + waitingCross2.join() + "</p>"; //第三次過橋(過去3人,剩餘1人) for (var m = 0; m < 3; m++) { for (var n = m + 1; n < 3; n++) { //count += 1; var str3 = str2; var hadCrossed3 = hadCrossed2.concat(); var waitingCross3 = waitingCross2.concat(); var totalTime3 = totalTime2; var thirdGo1 = waitingCross3[m]; var thirdGo2 = waitingCross3[n]; totalTime3 = totalTime3 + thirdGo2; str3 += "<p>第三次過橋由" + thirdGo1 + "和" + thirdGo2 + "過,共計<fond style='color:red'>" + thirdGo2 + "</fond>分鐘,合計<fond style='color:red'>" + totalTime3 + "</fond>分鐘</p>"; //移除 waitingCross3.remove(thirdGo1); waitingCross3.remove(thirdGo2); waitingCross3.sort(function (a, b) { return a - b }); hadCrossed3.push(thirdGo1); hadCrossed3.push(thirdGo2); hadCrossed3.sort(function (a, b) { return a - b }); str3 += "<p>第三次過橋後 hadCrossed=" + hadCrossed3.join() + " waitingCross=" + waitingCross3.join() + "</p>"; //第四次返回(過去2人,剩餘2人) for (var l = 0; l < 2; l++) { count += 1; var hadCrossed4 = hadCrossed3.concat(); var waitingCross4 = waitingCross3.concat(); var str4 = str3; var totalTime4 = totalTime3; var fouthBack = hadCrossed4[l]; totalTime4 = totalTime4 + fouthBack; str4 += "<p>第四次返回由" + fouthBack + "過,共計<fond style='color:red'>" + fouthBack + "</fond>分鐘,合計<fond style='color:red'>" + totalTime4 + "</fond>分鐘</p>"; //添加 waitingCross4.push(fouthBack); waitingCross4.sort(function (a, b) { return a - b }); //移除 hadCrossed4.remove(fouthBack); hadCrossed4.sort(function (a, b) { return a - b }); str4 += "<p>第四次返回後 hadCrossed=" + hadCrossed4.join() + " waitingCross=" + waitingCross4.join() + "</p>"; //第五次過橋(全部通過) var hadCrossed5 = hadCrossed4.concat(); var waitingCross5 = waitingCross4.concat(); var totalTime5 = totalTime4; var fifthGo1 = waitingCross5[0]; var fifthGo2 = waitingCross5[1]; totalTime5 = totalTime5 + fifthGo2; str4 += "<p>第五次過橋由" + fifthGo1 + "和" + fifthGo2 + "過,共計<fond style='color:red'>" + fifthGo2 + "</fond>分鐘,合計<fond style='color:red'>" + totalTime5 + "</fond>分鐘</p>"; //添加 waitingCross5.remove(fifthGo1); waitingCross5.remove(fifthGo2); waitingCross5.sort(function (a, b) { return a - b }); //移除 hadCrossed5.push(fifthGo1); hadCrossed5.push(fifthGo2); hadCrossed5.sort(function (a, b) { return a - b }); str4 += "<p>第五次過橋後 hadCrossed=" + hadCrossed5.join() + " waitingCross=" + waitingCross5.join() + "</p>"; str4 += "<p><fond style='color:red'>本方案共計" + totalTime5 + "分鐘</fond></p>"; var str5 = "方案" + count + str4; str5 += "<p>==================================================================</p>"; $('#CrossBridge').append(str5); if (minTime > 0) { if (totalTime5 < minTime) { minStr = str5; } } else { minTime = totalTime5; minStr = str5; } } } } } } } //} $('#CrossBridge').append("<p>/********************************************最短時間方案爲**************************************************************/</p>"); $('#CrossBridge').append(minStr); } /* 數組中隨機取幾個元素 var items = ['1','2','4','5','6','7','8','9','10']; console.log( getRandomArrayElements(items, 4) ); 數組中隨機獲取一個元素 var item = items[Math.floor(Math.random()*items.length)]; */ function getRandomArrayElements(arr, count) { var shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index; while (i-- > min) { index = Math.floor((i + 1) * Math.random()); temp = shuffled[index]; shuffled[index] = shuffled[i]; shuffled[i] = temp; } return shuffled.slice(min); } Array.prototype.indexOf = function (val) { for (var i = 0; i < this.length; i++) { if (this[i] == val) return i; } return -1; } Array.prototype.remove = function (val) { var index = this.indexOf(val); if (index > -1) { this.splice(index, 1); } }