【问题标题】:Logical error in 2d array spiral alorithm二维阵列螺旋算法中的逻辑错误
【发布时间】:2021-09-05 23:02:50
【问题描述】:

我正在尝试用二维数组制作螺旋。但是我缺少如图所示的最后一个元素。

.

我试图在 while 循环中设置各种条件以在一个循环后停止算法,但我做不到,我因此而发疯。主要算法代码如下:

    // height is always bigger than width by 1
    char [][] blankGrid = new char [height][width];

    int dir = 0;
    int top = 0;
    int bottom = height-1;
    int left = 0;
    int right = width-1;

    //draw digit spiral
    while(top <= bottom && left <= right ) {

        //RIGHT
        if (dir == 0) {
            for (int i = left; i <= right; i++) {
                blankGrid[top][i] = '0';
                if(left != 0 )blankGrid[top ][i-1] = '0';
                System.out.println(" DIR = 0 Position changed: "+ top   + ", " + i);
            }
            top += 2;
            dir++;

            //DOWN
        } else if (dir == 1) {
            for (int i = top; i <= bottom; i++) {
                blankGrid[i][right] = '1';
                blankGrid[i-1][right] = '1';
                System.out.println(" DIR = 1 Position changed: "+ top   + ", " + i );
            }
            right -= 2;
            dir++;

            //LEFT
        }else if (dir == 2) {
            for (int i = right; i >= left; i--) {
                blankGrid[bottom][i] = '2';
                blankGrid[bottom][i+1] = '2';
                System.out.println(" DIR = 2 Position changed: "+ bottom   + ", " + i);
            }
            bottom -= 2;
            dir++;

            //UP
        }else if (dir == 3) {
            for (int i = bottom; i >= top ; i--) {
                blankGrid[i][left] = '3';
                blankGrid[i+1][left] = '3';
                System.out.println(" DIR = 3 Position changed: "+ top   + ", " + i);
            }
            left += 2;
            dir = 0;
        }
    }

   // display  grid
    for(int i = 0; i < height; i++) {
        for(int j = 0; j < width; j ++){
            System.out.printf("%c", blankGrid[i][j]);
        }
        System.out.println();
    }

我想要的输出:

我尝试过这样的事情:

 while(top <= bottom +/- 1 && left <= right +/- 1 )
 while(top <= bottom +/- 2 && left <= right +/- 2)
 while(bottom - top >= 0 && right - left >=0 )

还有更多,但结果与上图相同。

【问题讨论】:

  • 你试过调试了吗?你的发现/见解是什么。请添加一个小的失败示例、期望的结果、实际结果以及您在调试过程中发现的内容。
  • 我尝试了不同的条件,但它们以相同的方式结束。通过添加所需结果进行编辑。实际结果高于以上

标签: arrays algorithm 2d spiral


【解决方案1】:

原因是你更新了边界变量(topleftrightbottom),每次更新一步,你仍然需要填充一个单元格 当您从下一个方向开始时,在该框之外(这就是为什么您在内部循环的每次迭代中执行两个 blankGrid 分配——这看起来很奇怪)。只要while 条件为真,这没有问题,但在最后阶段该条件将为假,这意味着“盒子”已缩小为空。然而仍然有这一个细胞要放置......

一种解决方案是不要用 2 更改该边界,而只更改 1,并在您从下一个方向开始时执行另一个递增/递减。

你的循环体可以用这个想法更新如下:

        //RIGHT
        if (dir == 0) {
            for (int i = left; i <= right; i++) {
                blankGrid[top][i] = '0';
            }
            if (left > 0) left++;
            top++;
            dir++;
            //DOWN
        } else if (dir == 1) {
            for (int i = top; i <= bottom; i++) {
                blankGrid[i][right] = '1';
            }
            top++;
            right--;
            dir++;
            //LEFT
        }else if (dir == 2) {
            for (int i = right; i >= left; i--) {
                blankGrid[bottom][i] = '2';
            }
            right--;
            bottom--;
            dir++;
            //UP
        }else if (dir == 3) {
            for (int i = bottom; i >= top ; i--) {
                blankGrid[i][left] = '3';
            }
            bottom--;
            left++;
            dir = 0;
        }

我只是做了一些小改动以使其正常工作,但您应该尽量减少代码的重复。这 4 个代码块相似,可以折叠成一个。但由于这与问题无关,我将把它留给你改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多