Java创建螺旋

标签 java algorithm math optimization

<分区>

Possible Duplicate:
Looping in a spiral

我正在创建一个程序来填充 3 x 3 矩阵。我想得到这样的结果

5 4 3
6 1 2
7 8 9

正如您可能已经注意到的那样,它是一个螺旋形的。 现在我使用的算法是这样的:我有一个二维数组,其中的值代表数字的坐标。首先,我指定该数组中的每个数字坐标的值为 10。然后从 9 开始,我减小 x 坐标并将坐标的值分配给 currentnum - 1,直到它到达末尾或它的值不是 10;然后我做同样的事情,只是我增加了 Y 的值;然后减小x的值;然后是 Y;

我为每个数字分配 10 的原因就像它充当我的程序的道路。由于当前 num 永远不会超过 9。如果正方形的值为 10,则它就像绿灯。如果它不是 10,则表示已为该方 block 分配了一个值,它会脱离它。

这是我的代码,请注意它是用 Java 编写的

public class spiral {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int spiral [] [] = new int[3][3];
        for(int i = 0; i <= 2; i++){
            for(int j = 0; j <= 2; j++){
                spiral[i][j] = 10;
            }
        }
        //0 is x value, 1 is y value
        spiral[0][0] = 9;
        int x = 1;
        int y = 1;
        int counter = 1;
        int currentnum = 9;
        int gridsquare  = 3;
        for(int i = 0; i <= 8; i++){

            if(counter == 5){
                counter = 1;
            }
            if(counter == 1){
                System.out.println(x + " " + y);
                for(int j = 0;j <= 1;j++){
                    if(spiral[x][y] == 10){
                        spiral[x][y] = currentnum;
                        currentnum--;
                        x += 1;
                    }
                    else{
                        y += 1;
                        break;
                    }
                }
            }
            if(counter == 2){
                for(int k = 0; k <= 0; k++){
                    System.out.print(x + " " + y);
                    if(spiral[x][y] == 10){
                        spiral[x][y] = currentnum;
                        currentnum--;
                        y += 1;
                    }
                    else{
                        x -= 1;
                        break;
                    }
                }
            }
            if(counter == 3){
                for(int z = 0; z <= 0; z++){
                    if(spiral[x][y] == 10){
                        spiral[x][y] = currentnum;
                        currentnum--;
                        x -= 1;
                    }
                    else{
                        y -= 1;
                        break;
                    }
                }
            }
            if(counter == 4){
                for(int b = 0; b <= 0; b++){
                    if(spiral[x][y] == 10){
                        spiral[x][y] = currentnum;
                        currentnum--;
                        y -= 1;
                    }
                    else{
                        x += 1;
                        break;
                    }
                }
            }
            counter++;
        }
        System.out.print(currentnum);
    }
}

我遇到了这个错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at spiral.main(spiral.java:44)

由于我是 Java 的新手,请有人为此提出一个可能的修复建议。另外,如果您发现我的算法有任何问题,请通知我。

最佳答案

您不需要预填 10:0 也可以。

我认为解决螺旋线的最佳方法是考虑如何手动解决:从一个角开始,水平移动直到碰到非零值或数组的边缘。然后你右转。当当前数字超过 N*N 时停止。

现在让我们看看算法的每个部分的含义:

  • 从角落开始意味着设置 x=0 和 y=0。
  • 走直线意味着 x=x+dx,y=y+dy,其中 dx 或 dy 为零,dy 或 dx 为 1 或 -1。
  • 右转意味着将 dx 分配给 dy,将 -dy 分配给 dx。

代码如下:

int current = 1;
// Start in the corner
int x = 0, y = 0, dx = 1, dy = 0;
while (current <= N*N) {
    // Go in a straight line
    spiral[x][y] = current++;
    int nx = x + dx, ny = y + dy;
    // When you hit the edge...
    if (nx < 0 || nx == N || ny < 0 || ny == N || spiral[nx][ny] != 0) {
        // ...turn right
        int t = dy;
        dy = dx;
        dx = -t;
    }
    x += dx;
    y += dy;
}

关于Java创建螺旋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8380587/

相关文章:

regex - 从大量文本中提取数千个简单模式的快速算法

javascript - 除法结果不正确

c++ - 你会如何计算这个函数中的j?

java - 乒乓球离开帕德尔

java - 是否可以将几个 StringArray 值写入一个 String 中?

java |从 URL 获取协议(protocol) ://domain. 端口的 API

algorithm - 对该算法的复杂性感到困惑

java - MapReduce 作业 : weird output?

java - 如何在同一条语句中初始化队列

javascript - 如何从多个数组中删除最小数字