2

私は 8x8 行列を持っています。必要な行を選択した後、その 3 つの最小要素を取得し、この 3 つのうちの 1 つをランダムに選択したいと考えています。問題は、これらの 3 つの要素を処理する方法がわからないということです。最小要素を取得する方法を知っているだけです。それは次のコードです。

int piezas[8][8] = {
0, 2, 2, 5, 3, 2, 1, 1,
0, 4, 5, 2, 4, 3, 0, 0,
0, 4, 2, 2, 1, 2, 3, 2,
0, 3, 1, 5, 1, 2, 3, 4,
2, 5, 6, 5, 3, 1, 2, 7,
8, 2, 0, 0, 0, 2, 1, 1,
1, 2, 2, 1, 1, 6, 3, 4,
};

int myrow = 3; // the row I want to analyze
int index;
int min=0;

for (index=0;index<8;index++) {
    printf("%d", piezas[myrow][index] );
    if(piezas[myrow][index]<min)
        min=piezas[myrow][index];
    printf("\t\t");
}
printf("min: %d", min);

初期行列が次の場合、必要な出力は次のとおりです。

int piezas[8][8] = {
0, 2, 2, 5, 3, 2, 1, 1,
0, 4, 5, 2, 4, 3, 0, 0,
0, 4, 2, 2, 1, 2, 3, 2,
0, 3, 1, 5, 1, 2, 3, 4,
2, 5, 6, 5, 3, 1, 2, 7,
8, 2, 0, 0, 0, 2, 1, 1,
1, 2, 2, 1, 1, 6, 3, 4,
};

そして、行番号 3 を選択します。

0, 3, 1, 5, 1, 2, 3, 4,

アルゴリズムは選択する必要があります

0, 1, 1

そして、この3つからランダムに1つを選びます。

誰かがどうすればそれを行うことができるかについてのアイデアを教えてもらえますか? 今朝早くからこれに固執しています。ありがとう

4

7 に答える 7

2

次に、行を並べ替えて、最初の 3 つの要素のうちの 1 つをランダムに並べ替えます。

// integer comparator
int compare(int * a, int * b) {return *a - *b;}

// allocate memory to hold the copy
int rowCopy[sizeof(piezas[myrow])/sizeof(int)];
// copy the row
memcpy(rowCopy, piezas[myrow], sizeof(piezas[myrow]));
// sort it
qsort(rowCopy, sizeof(piezas[myrow])/sizeof(int), sizeof(rowCopy[0]), compare);
// initialize the random number generator
srand(time(NULL));
// return randomly one of the first 3 elements
return rowCopy[rand() % 3]
于 2013-05-13T09:16:34.080 に答える
0

一般的に言えば、ヒープソートを使用して、選択した行などの配列内の N 個の最小要素を取得できます。すべての要素を並べ替える必要はありません。ただし、並べ替えの結果を行自体に保存しないでください。rand() を使用して、そのうちの 1 つを取得します。

于 2013-05-13T09:42:09.680 に答える
0
#include <stdio.h>

int main(void){
    int piezas[8][8] = {
        0, 2, 2, 5, 3, 2, 1, 1,
        0, 4, 5, 2, 4, 3, 0, 0,
        0, 4, 2, 2, 1, 2, 3, 2,
        0, 3, 1, 5, 1, 2, 3, 4,
        2, 5, 6, 5, 3, 1, 2, 7,
        8, 2, 0, 0, 0, 2, 1, 1,
        1, 2, 2, 1, 1, 6, 3, 4,
    };

    int myrow = 3; // the row I want to analyze
    int index;
    int min[3]={99,99,99};//or INT_MAX at <limits.h>
    for (index=0;index<8;index++) {
        printf("%d", piezas[myrow][index] );
        int i, temp = piezas[myrow][index];
        for(i=0;i<3;++i){
            if(temp<=min[i]){
                int wk = min[i];
                min[i]=temp;
                temp = wk;
            }
        }
        printf(" ");
    }
    printf("min:");
    for(index=0;index<3;++index)
        printf(" %d", min[index]);
    return 0;
}
于 2013-05-13T10:07:46.390 に答える
0

tmp_array (8 要素) の 1 行のコピーを作成し、qsort(tmp_array)最後にrand() % 3を回答要素番号として使用します。

于 2013-05-13T09:15:36.910 に答える
0

簡単な解決策は、3 つの最小変数を保持するための 3 つの変数 min1、min2、min3 を用意することです。

于 2013-05-13T09:15:36.760 に答える