【问题标题】:Algorithm to determine correct character ['╦', '╣', '╠', '╩', '╬'] for intersections in grid确定网格中交叉点的正确字符 ['╦', '╣', '╠', '╩', '╬'] 的算法
【发布时间】:2016-02-10 00:58:41
【问题描述】:

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

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

11111111111111111111
10001000000000000001
10101111111010101111
10101111111010100001
10101111111010111101
10101111111010000001
10100000000010111111
11111111111111111111

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

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

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

对于这个问题,我非常感谢任何形式的指导。 Javascript 将是首选,但任何事情都会有所帮助!

【问题讨论】:

  • 我不确定这是否是一个合适的问题。通常,这里的用户至少希望看到您编写的代码作为开始。在这种情况下,我将首先用您的网格对象替换 1 和 0(无论旋转如何)。然后从那里去。
  • 谢谢,我会尝试添加一些代码。

标签: javascript algorithm grid ascii ascii-art


【解决方案1】:

“你怎么能写算法……”的最短答案是“想想看”,但我同意这可能很难开始。

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

有意义吗?

【讨论】:

    【解决方案2】:

    这样就可以了。

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

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

    【讨论】:

    • 非常感谢。我认为有一个非常聪明的方法可以做到这一点,我只是不确定要搜索什么或从哪里开始。这将极大地帮助我。
    • 对我来说,它不能处理左上角,可能是因为“x-1”、“y-1”检查没有解决。我认为它的工作将是它被接受为答案的一个很好的先决条件,但这是你的电话。
    • 它对我有用。我正在从迷宫生成器中输入二进制矩阵,我还没有看到任何错误,但左上角总是有一个 1,所以我明白你在说什么
    • @christutty,我处理了负索引,我认为您在记录字符串时遇到的是控制台添加的“(可以说是“序列化错误”)。尝试在前面添加一个“ \n",因此第一行显示在控制台中与其余行相同的列中。
    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2011-12-19
    • 2020-03-02
    • 1970-01-01
    • 2018-07-05
    • 2012-02-24
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多