【问题标题】:Traversing grid in a snake like pattern以蛇形图案遍历网格
【发布时间】:2015-11-20 17:57:10
【问题描述】:

我有一个矩形,它由笛卡尔坐标系上的四个角定义。 矩形由大小相同的单元格组成。

给定一个角单元格作为起点和方向(沿 x 轴或 y 轴),我如何以蛇形图案穿过此网格?

例如,这里 (x4, y4) 是起始单元格,方向被定义为沿 x 轴。蓝线描绘了所需的路径。

谢谢!

【问题讨论】:

  • 好吧,向左走直到撞到墙。然后上一个。然后向右走,直到撞到墙。然后上去。然后向左走,直到撞到一堵墙。然后上一个。然后向右走,直到撞到墙。然后上去。然后向左走,直到撞到一堵墙。然后向上走。然后向右走,直到撞到墙。然后上去。然后向左走,直到撞到一堵墙。然后向上走。然后向右走,直到撞到墙。然后上去。然后向左走,直到撞到一堵墙。然后向上走。然后向右走,直到撞到墙。然后上去。然后向左走,直到撞到墙……明白了吗?
  • @dingalapadum 这就是我一直在做的,但我希望有一个更优雅的解决方案。目前我的实现非常麻烦,因为,起点和方向的所有组合只会导致大量的 if/else/for_loops
  • 我是在开玩笑。但是一个好的开始是在这里发布你的代码,看看你尝试了什么。你是如何获得输入的。输出应该是什么样的?就目前而言,问题并不那么清楚..
  • 输入只是四对坐标加上方向(假设一个布尔值:true = 沿 x 轴,false = 沿 y 轴)输出是沿路径的坐标数组。

标签: algorithm rectangles cartesian-coordinates


【解决方案1】:

尝试这 4 对点来找到定义框的相反点。然后你有一个起点和一对相反的点。在您的情况下,followAlongX 将是一个输入,因此不需要测试方向,但我添加了一个经典的决策文本。

最后,尝试类似(Java,用记事本编写,未测试):

int stepY, stepX, yMin, yMax, yOpposite, yStart, xMin, xMax, xOpposite, xStart;
if (yOpposite > yStart) {
    stepY = 1;
    yMin = yStart;
    yMax = yOpposite;
}
else {
    stepY = -1;
    yMax = yStart;
    yMin = yOpposite;
}

if (xOpposite > xStart) {
    stepX = -1;
    xMin = xStart;
    xMax = xOpposite;
}
else {
    stepX = 1;
    xMin = xOpposite;
    xMax = xStart;
}

// boolean followAlongX = false;
// if (xMax-xMin>yMax-yMin) {
//     loopOnX = true;
// }

List<Points> path = new ArrayList<>();
if (followAlongX) {
    for (int i=yMin; i!=yMax; i+=stepY) {
        for (int j=xmin; j!=xmax; j+=stepX) {
            path.add(new Point(i,j));
        }
        stepX = -stepX;
        int temp = xMin;
        xMin = xMax;
        xMax = temp;
    }
}
else {
    for (int j=xmin; j!=xmax; j+=stepX) {
        for (int i=yMin; i!=yMax; i+=stepY) {
            path.add(new Point(i,j));
        }
        stepY = -stepY;
        int temp = yMin;
        yMin = yMax;
        yMax = temp;
    }
}
return path.toArray(new Point[path.size()]);

【讨论】:

  • 你可以避免复制这两种情况的双循环。为此 1) 删除其中一个双循环,2) 删除剩余双循环之前的测试,3) 在创建点之前测试 followAlongX,4) 根据测试将 (i,j) 切换到 (j,i)结果。
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2013-03-19
  • 2023-03-20
相关资源
最近更新 更多