首頁 > web前端 > js教程 > 主體

JavaScript趣題:迷路的牛仔

黄舟
發布: 2017-02-13 15:57:37
原創
1201 人瀏覽過

很久以前,有一條通往西部無法地帶的路......

一位年輕的牛仔,根據指示,得從一個地方前往另一個地點。指示像這樣"NORTH", "SOUTH", "WEST", "EAST"

很明顯,"NORTH""SOUTH"是相反的方向, "WEST""EAST"也是相反的。

走一個方向,然後又往回走,無疑在做無用功。

在這人跡罕至的西部荒野,糟糕的天氣,匱乏的水源,節約點體力很重要,否則很可能死於非命!

怎樣走最明智的路線,這很重要!

給牛仔的指示,像下面這樣:


plan = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
登入後複製

你能一眼看出,"NORTH""SOUTH",這樣的路線顯然是不合理的,最好呆在原地。
所以,你的任務是,怎樣精簡路線,以節省體力。

一個更好的方案應該像這樣:


plan = ["WEST"]
登入後複製

另一個例子:

["NORTH", "SOUTH", "EAST", "WEST"]

""SOUTH"做抵消,"EAST""WEST"做抵消,最後返回空數組。

再看個複雜點的例子:

 ["NORTH", "EAST", "WEST", "SOUTH", "WEST", "WEST"]

"EAST", "WEST"]

"EAST", "WEST"EAST",作抵消,得到

 ["NORTH",  "SOUTH", "WEST", "WEST"]"NORTH",  "SOUTH"

"NORTH",  "SOUTH"作抵消,最後得到["WEST", "WESTWEST" 。
但是,請注意,下面這種情況是沒辦法抵消的:

["NORTH", "WEST", "SOUTH", "EAST"] 

因為

"EAST", "WEST"

"NORTH",  "SOUTH"

並非相鄰,而是隔開的。

咋們來看看怎麼寫一個這樣的減少路線函數吧。


它接受一個字串陣列作為參數,並傳回新的字串陣列。

像這樣:


dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]) // ["WEST"]
dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH"]) // []
登入後複製

第一步,建立方向的映射關係,哪些是相反的方向:

var opposite = {
    "NORTH":"SOUTH",
    "SOUTH":"NORTH",
    "EAST":"WEST",
    "WEST":"EAST"
};
登入後複製

接著,從後向前遍歷數組,就從數組中移除,抵消。


然後,開始第二輪遍歷,移除,抵消,第三輪,第N輪,直到找不到相反的方向,跳出循環。

此時的陣列就是經過精簡後的最佳路線。


function dirReduc(arr){
    var flag = false;
    while(!flag){
        for(var i=arr.length-2,flag=true;i>=0;i--){
            if(opposite[arr[i]] === arr[i+1]){
                arr.splice(i+1,1);
                arr.splice(i,1);
                i--;
                flag = false;
            }
        }
    }
    return arr;
}
登入後複製
🎜🎜以上就是JavaScript趣題:迷路的牛仔的內容,更多相關內容請關注PHP中文網(www.php.cn)! 🎜🎜🎜
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!