2016-02-10 23 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等)。

有意义吗?