魔方发电机

时间:2015-12-03 01:23:48

标签: java arrays algorithm

我正在尝试开发一个程序,用于创建和打印n X n“魔术方块”,其中n是用户生成的奇数。但是,我一直得到同样的错误“java.lang.ArrayIndexOutOfBoundsException:3”

算法摘要:

  1. 将1放在第一行(第0行)的中心

  2. 根据以下规则放置2,3,4 ... n

  3. 向上和向右移动到新位置(row,col),即row = row-1,col = col + 1 如果row = -1(行离开数组),则将数字放在(n-1,col)中的最后/最后一行

    如果col = n(列不在数组中),则将数字放入(row,0)

    从顶角广场移动时,如果拍摄地点,请将下一个数字放在左下角的正方形中,将新号码放在前一个数字下面

    import java.util.*;
    public class MagicSquare
    {
    public static void main (String[] args)
    {
    Scanner input = new Scanner(System.in);
    
    System.out.println("Enter an odd integer:");
    
    int n = input.nextInt();
    
    int[][] magic = new int[n][n];
    
    int row = 0;
    int col = (n-1)/2;
    magic[row][col] = 1;
    
     for(int i=2; i <=n*n; i++)
    {
       if(magic[row-1][col+1]==0){
         row=row-1;
         col=col+1;
       }
       else{
         row=row+1;
       }
       if(row==-1)
         row = n-1;
       if (col== n)
         col=0;
       magic[row][col]=i;
    }
    for(int x = 0; x<n; x++)
    {
      for(int y=0; y<n; y++)
        System.out.print("|"+magic[x][y] +"|\t");
      System.out.println();
     }
    }
    }
    

    编辑 - 格式化

2 个答案:

答案 0 :(得分:0)

for循环中,您将row重置为结尾:

if(row==-1)
  row = n-1;

但是在下一次迭代中,您使用row + 1进行索引:

if(magic[row+1][col+1]==0)

哪一天会结束。

答案 1 :(得分:0)

所以,遵循你的规则(感谢重新格式化它们!):

odd_numbers = [number % 2 = 1 for number in range(10)]

这非常类似于条件(!= 0)中的更改以检测占用的位置,并且通过分离所有的添加和减少,当几个发生在一个中时,更容易看到组合结果行。

我没有测试过这段代码,所以它可能仍有问题,但希望这会让你走上正确的道路!