2013-05-08 113 views
0

我的目标是创建一个二维数组,它将使用一维数组的随机排列来填充。 tab的第一行和第一列不应填写。这是我到目前为止已经试过,不工作:使用一维数组的排列填充一维数组

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

#define S 5 

void make_board(char tab[S][S]){ 
    int i; 
    int j; 
    char signs[16] = {'Z', 'Z', 'Y','Y','X','X','W','W','U', 'U', 'V', 'V', 'S', 'S', 'T', 'T'}; 

    srand(time(NULL)); 

    for(i = 0; i < 16; i++){ 
     int r = (rand() % 16); 
     int rx = (rand() % 4) + 1; 
     int ry = (rand() % 4) + 1; 
     tab[rx][ry] = signs[r]; 
    } 
} 

回答

0

也许你应该使用signs[r],而不是rtab[rx][ry] = r;

+0

,但它仍然犯规给我我需要什么,有些领域总是空的,有的有字符我不包括在我的数组 – Leo 2013-05-08 22:10:18

+0

你只循环多达16个,但现场有大小5x5,所以你需要循环从0到25,rx = rand()%5; ry = rand()%5; – 2013-05-08 22:12:24

+0

不,我想第一列和第一行是空的,它的描述;) – Leo 2013-05-08 22:15:35

0

对于一个置换,其中每个charsigns被置于tab的独特位置,您需要做更多的工作。

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

#define S 5 
#define C 16 

int main() 
{ 
    char signs[C] = {'Z', 'Z', 'Y', 'Y', 'X', 'X', 'W', 'W', 'U', 'U', 'V', 'V', 'S', 'S', 'T', 'T'}; 
    char tab[S][S]; 

    srand(time(NULL)); 

    // generate the random permutation 
    size_t perm[C]; 
    for (int i = 0; i < C; i++) 
     perm[i] = i; 

    for (int i = 0; i < C; i++) 
    { 
     int j = rand() % C; 
     char tmp = signs[j]; 
     signs[j] = signs[i]; 
     signs[i] = tmp; 
    } 

    // copy the chars to tab 
    int k = 0; 
    for (int i = 1; i < S; i++) 
    { 
     for (int j = 1; j < S; j++) 
     { 
      tab[i][j] = signs[perm[k++]]; 
      printf("%c", tab[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
当然,我的错误
+0

它的工作原理,但它给了我例如。 'Z'三次;/ – Leo 2013-05-08 22:46:11

+0

它是随机的,所以每次输出都会有所不同。你是说你不想在每一行重复任何字母? – Max 2013-05-08 22:49:12

+0

以及我希望'标志'的每个元素只能使用一次。它将是Z的两倍,Y的两倍等等......我认为srand正在照顾它 – Leo 2013-05-08 22:51:21