订购多维数组

时间:2014-05-08 22:20:44

标签: c random multidimensional-array

我目前能够成功制作一个数独的代码,根据一组随机排列随机交换列,排列只能在排列的前3个数字中有前3个数字,以保持董事会有效,例如{3,2,1,4,5,6,7,8,9}是有效的,但{4,2,3,1,5,6,7,8,9}不是,但是。现在我必须找到一个交换堆栈的方法(每3列是一个堆栈),这似乎比将列交换给我更困难。

我已经在下面提供了我的列交换代码,我已经想到了这样的想法,而不是随机排列1-9列随机permutation1数组,就像我在当前代码中所做的那样,我应该尝试生成随机排列数组然而,随机数在1-9之间;相反,我想只能生成一个随机数组,如{1,2,3,7,8,9,4,5,6}或{7,8,9,4,5,6,1,2 ,3}。

有人可以告诉我一种方法,我可以随机生成9个数字,但总是有1,2,3个顺序,4,5,6顺序,7,8,9顺序。如果没有人能告诉我一个更有效的方法,那么我已经提出过了吗?

更新的代码:我更新的代码似乎无法读取我在每个if / else-if语句中定义的permutation1和permutation2数组。

#include <stdio.h>
#include <time.h>

int main(){
    int number, j, k;
    int p=0, q=0;
    int count=0;//initialize count
    int x, i;
    int m=0;
    int permutation1[9];
    int permutation2[3];

    int canonical[9]={1, 4, 7, 2, 5, 8, 3, 6, 9};
    int sudoku[9][9];

    srand(time(NULL));
    int randnum=rand()%6+1;

    if(randnum==1){
        permutation1[9]={1,2,3,4,5,6,7,8,9};
        permutation2[3]={1,2,3};
    }
    else if(randnum==2){
        permutation1[9]={1,2,3,7,8,9,4,5,6};
        permutation2[3]={1,3,2};
    }
    else if(randnum==3){
        permutation1[9]={4,5,6,1,2,3,7,8,9};
        permutation2[3]={2,1,3};
    }
    else if(randnum==4){
        permutation1[9]={4,5,6,7,8,9,1,2,3};
        permutation2[3]={2,3,1};
    }   
    else if(randnum==2){
        permutation1[9]={7,8,9,1,2,3,4,5,6};
        permutation2[3]={3,1,2};
    }
    else if(randnum==2){
        permutation1[9]={7,8,9,4,5,6,1,2,3};
        permutation2[3]={3,2,1};
    }

    for(k=1;k<10;k++){
        number=k;

        if(number == 1){
            for (j=0;j<9;j++)
                sudoku[(canonical[p]-1)][j] = number++;
            p++;
        }

        else {
            for (j=0;j<9;j++){
                sudoku[(canonical[p]-1)][j] = number++;
                if (number > 9)  {
                    number = number - 9;
                }
            }
            p++;
        }
    }

    for(i=0;i<9;i++){
        for (j=0;j<9;j++) {
            printf("%2d", sudoku[i][j]);
        }
        printf("\n");
    }

    printf("\nGiven the permutation: ");
    for(p=0;p<3;p++){
        printf("%2d", permutation2[p]);
    }
    printf("\n");

    for(q=0;q<9;q++){
        for(j=0;j<9;j++){
            printf("%2d",sudoku[q][permutation1[j]-1]);
        }
        printf("\n");
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

有人可以告诉我一种方法,我可以随机生成9个数字,但顺序总是1,2,3,顺序是4,5,6,顺序是7,8,9?

只有六种符合您标准的排列。他们是:

1 2 3 4 5 6 7 8 9
1 2 3 7 8 9 4 5 6
4 5 6 1 2 3 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
7 8 9 4 5 6 1 2 3

因此,请选择1到6之间的随机数,并使用它来选择所需的排列。