为网格中的交叉点确定正确字符 ['╦', '╣', '╠', '╩', '╬'] 的算法

Algorithm to determine correct character ['╦', '╣', '╠', '╩', '╬'] for intersections in grid

我什至无法开始思考这个问题。

给定一个二进制值数组,其中 0 对应于开放 space,1 对应于墙:

11111111111111111111
10001000000000000001
10101111111010101111
10101111111010100001
10101111111010111101
10101111111010000001
10100000000010111111
11111111111111111111

你怎么能写一个算法把它改成这样:

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

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

对于这个问题的任何指导,我将不胜感激。 Javascript 将是首选,但任何事情都会有所帮助!

"How could you write an algorithm..." 的最短答案是 "Think about it",但我同意这可能很难开始。

通常最好的方法是分解问题,因此一次只考虑一个单元格,从左上角开始。要决定放置哪个角色,您将必须测试周围的单元格以找出存在多少个连接墙,然后有一些逻辑会告诉您在每种情况下使用哪个角色(没有连接墙 = x,向下一堵墙= y,向下一堵墙,向左一堵墙 = z,等等)。

有道理吗?

这样就可以了。

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`)

为了理解整个代码,我建议您对代码进行膨胀并开始调试它并用注释对其进行注释。