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];
    }
}
4

2 回答 2

0

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

于 2013-05-08T22:04:15.957 回答
0

对于排列,其中每个charinsigns都被放置在 in 的唯一位置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;
}
于 2013-05-08T22:29:53.597 回答