2014-05-08 195 views
1

我目前已經能夠成功地做出隨機交換列的隨機交換列的隨機置換的代碼,排列只能有排列的前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

不要刪除你的問題泰坦。 – pmg

回答

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之間的隨機數,並用它來選擇您想要置換。

+0

我正在考慮這樣做,所以它基本上是6條語句? – Titan

+0

@ user3571645:您可以改爲創建一個二維6x9數組,然後將其索引到該數組中。 –

+0

我試圖使用6 if if else語句,但它似乎沒有正確讀取我的排列數組 – Titan