我目前能够成功制作一个数独的代码,根据一组随机排列随机交换列,排列只能在排列的前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;
}
答案 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之间的随机数,并使用它来选择所需的排列。