2016-02-10 50 views
1

我甚至無法開始圍繞這個包圍我的頭。爲網格中的交叉點確定正確的字符的算法

鑑於二進制值的陣列0對應於開放空間和1被人牆:

11111111111111111111 
10001000000000000001 
10101111111010101111 
10101111111010100001 
10101111111010111101 
10101111111010000001 
10100000000010111111 
11111111111111111111 

你怎麼能寫一個算法來改變它的東西是這樣的:

╔═══╦══════════════╗ 
║ ║    ║ 
║ ║ ╠╦╦╦╦╦╗ ║ ║ ═══╣ 
║ ║ ╠╬╬╬╬╬╣ ║ ║ ║ 
║ ║ ╠╬╬╬╬╬╣ ║ ╚═══ ║ 
║ ║ ╚╩╩╩╩╩╝ ║  ║ 
║ ║   ║ ╔╦╦╦╦╣ 
╚═╩═════════╩═╩╩╩╩╩╝ 

╔═══╦══════════════╗ 
║ ║    ║ 
║ ║ ╠═════╗ ║ ║ ═══╣ 
║ ║ ║  ║ ║ ║ ║ 
║ ║ ║  ║ ║ ╚═══ ║ 
║ ║ ╚═════╝ ║  ║ 
║ ║   ║ ╔════╝ 
╚═╩═════════╩═╝ 

我非常感謝任何關於這個問題的指導。 Javascript是首選,但任何事情都會有所幫助!

+0

我不確定這是否是一個合適的問題。通常,這裏的用戶希望看到您至少編寫的代碼作爲開始。在這種情況下,我會開始用網格對象替換1和0(不管旋轉)。然後從那裏出發。 –

+0

謝謝,我會嘗試添加一些代碼。 – loubeasley

回答

0

這將完成這項工作。

function toMap(str){ 
    var chars = " ║═╚║║╔╠═╝═╩╗╣╦╬"; 
    var arr = str.split("\n"); 
    var v = (x,y,s)=>(y >= 0 && x >= 0 && y < arr.length && arr[y].charAt(x)==="1") << (s|0); 
    return arr.map((r,y)=>r.split("").map((c,x)=>chars.charAt(v(x,y)&&(v(x,y-1)|v(x+1,y,1)|v(x,y+1,2)|v(x-1,y,3)))).join("")).join("\n") 
} 

toMap(`11111111111111111111 
10001000000000000001 
10101111111010100111 
10101011111010100001 
10101110111010111101 
10101111111010000001 
10100000000010111111 
111111111111111`) 

爲了理解整個代碼,我建議你膨脹代碼並開始調試它並用註釋對它進行註釋。

+0

非常感謝。我覺得有一個非常聰明的方式來做到這一點,我只是不知道要搜索什麼或從哪裏開始。這對我非常有幫助。 – loubeasley

+0

對我來說,它不處理左上角,可能是因爲'x-1','y-1'檢查沒有解決。我認爲它的一小部分工作將是它被接受爲答案的一個很好的先決條件,但這是你的呼叫。 – christutty

+0

它爲我工作。我從一個迷宮發生器餵它的二進制矩陣,我還沒有看到任何錯誤,但總是有一個在左上角,所以我得到你在說什麼 – loubeasley

3

「你怎麼能寫一個算法......」的最短答案是「想想它」,但我同意它可能很難開始。

通常最好的方法是將問題解決,所以從左上角開始,一次只考慮一個單元。要決定放置哪個角色,您必須測試周圍的單元格以查找存在多少個連接牆,然後使用一些邏輯來告訴您在每種情況下使用哪個角色(無連接牆= x,牆下= y,一面牆向下,一面向左= z等)。

有意義嗎?