首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java创建螺旋线

Java创建螺旋线
EN

Stack Overflow用户
提问于 2011-12-05 03:02:19
回答 2查看 4.5K关注 0票数 0

可能重复:

Looping in a spiral

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

代码语言:javascript
复制
5 4 3
6 1 2
7 8 9

正如你可能已经注意到的,这是一个螺旋。现在我使用的算法是:我有一个二维数组,其中值表示数字的坐标。首先,我给这个数组中的每个数字坐标赋值10。然后从9开始,我将x坐标减小,并将坐标的值赋值给currentnum 1,直到它到达终点或它的值不为10为止;然后,我做同样的事情,除了增加Y的值外,然后降低x的值,然后是Y的值。

我给每个数字分配10的原因就像它是我的程序的一条路。因为现在的数值永远不会超过9。如果正方形的数值是10,那就像绿灯一样。如果它不是10,这意味着一个值已经被分配给那个正方形,它就会打破它。

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

代码语言:javascript
复制
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);
    }
}

我得到了这个错误

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at spiral.main(spiral.java:44)

既然我是刚接触Java的人,请给我建议一个可行的解决方案。另外,如果你发现我的算法有任何问题,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-05 03:37:47

你不需要预先填充10: 0同样有效。

我认为解决螺旋问题的最好方法是考虑如何手动完成:从一个角落开始,然后水平移动,直到到达非零或数组的边缘为止。然后你向右拐。当当前数超过N*N时停止。

现在让我们看看算法的每个部分意味着什么:

从拐角处开始的

  • 意味着设置x=0和y=0。
  • 在一条直线上表示x=x+dx,y=y+dy,其中dx或dy为零,dy或dx为1或-1,
  • 右转意味着将dx分配给dy,将-dy分配给dx.

下面是代码中的内容:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-05 03:09:42

您已经将xy增量为3,这已经超过了一个数组的末尾。

使用调试器或在每个System.out.println之前添加if (counter)语句,以了解您在何处执行此操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8380587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档