生成'特殊矩阵'

时间:2016-11-27 12:25:27

标签: java arrays algorithm recursion matrix

我正在尝试解决以下问题:

给定数字n,生成大小为2 ^ n * 2 ^ n的矩阵,使其符合以下规则:

n = 1 
[ 1 2 ]
[ 3 4 ]

n = 2 
[ 1   2    5  6 ]
[ 3   4    7  8 ]
[ 9  10   13 14 ]
[ 11 12   15 16 ]

这是我的算法:

static void generare(int i , int j , int x , int y){
    if(x - i == 1 && y - j == 1)
        {
        mat[i][j] = counter++;
        mat[i][j+1] = counter++;
        mat[i+1][j] = counter++;
        mat[i+1][j+1] = counter++;
        }
    else{
        generare(i,j,x/2,y/2);
        generare(i,y/2+1,x/2,y);
        generare(x/2+1,j,x,y/2);
        generare(x/2+1,y/2+1,x,y);
    }
}

适用于n = 1,2但是当我尝试任何数字时> 2,它崩溃了。我该如何修复递归函数?

1 个答案:

答案 0 :(得分:3)

首先,我认为你调用函数的方式是不正确的。对我来说,你发布的代码甚至不适用于4X4阵列。我认为应该使用(0, 0, 2^n, 2^n)调用递归函数

无论如何,解决方案如下(我将解释):

private static int[][] mat;
private static int counter = 1;

public static void generare(int i, int j, int x, int y) {
    if (x - i <= 2 && y - j <= 2) {

        mat[i][j] = counter++;
        mat[i][j+1] = counter++;
        mat[i+1][j] = counter++;
        mat[i+1][j+1] = counter++;
    } else {
        generare(i, j, x/2+i/2, y/2+j/2);
        generare(i, j+(y-j)/2, x/2 +i/2, y);
        generare(i+(x-i)/2, j, x, y/2+j/2);
        generare(i+(x-i)/2, j+(y-j)/2, x, y);
    }
}

public static void main(String[] args) {
    int power=3;
    int n =(int) Math.pow(2, power);
    mat = new int[n][n];
    generare(0, 0, n, n);
    for(int i=0;i<n;i++) {
        for(int j=0; j<n; j++){
            System.out.print(mat[i][j] +" ");
        }
        System.out.println();
    }
}

我解决它的方式是:

  1. 当我们达到2乘2阵列时,递归函数应该停止。
  2. 如果阵列大于2乘2阵列。我们应该用4个调用来调用该函数(就像你做的那样)但是有4个子数组。哪个是你弄错了,只是计算本身。
  3. 对于n = 1,2,它适用于你,因为递归调用只发生过一次。一旦您的代码多次运行,计算就不正确了。我所做的是绘制了一个8乘8的数组,并尝试仅使用i,j,x和y来表示调用。 希望这会有所帮助:)