为网格中的交叉点确定正确字符 ['╦', '╣', '╠', '╩', '╬'] 的算法
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`)
为了理解整个代码,我建议您对代码进行膨胀并开始调试它并用注释对其进行注释。
我什至无法开始思考这个问题。
给定一个二进制值数组,其中 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`)
为了理解整个代码,我建议您对代码进行膨胀并开始调试它并用注释对其进行注释。