(C)在矩阵中获取行的3个最小元素,并随机选择一个

我有一个8×8矩阵,在选择了我想要的行之后,我想得到它的三个最小元素,并随机选择这三个中的一个。 问题是我不知道如何处理这三个元素。 我只知道如何获得最小元素,即以下代码。

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 

并随机选择这三种中的一种。

有人可以给我任何想法,我该怎么办? 从今天早上起我就一直坚持这一点。 谢谢

 #include  #include  #include  #define SIZE_ROW 8 #define N_MIN 3 int piezas[SIZE_ROW][SIZE_ROW] = { 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 sort(const void *x, const void *y) { return (*(int*)x - *(int*)y); } int* sort_array(int* row, int size_row){ int* output = (int*) calloc(size_row, sizeof(int) ); memcpy(output, row, size_row*sizeof(int) ); // copy array qsort (output, size_row, sizeof (int), sort); return output; } int random_pick(int* array, int size_row){ return array[ rand() % size_row ]; // possible buffer overflow if size_row too big. } int main(void){ srand(time(NULL)); int myrow = 3; // the row I want to analyze int* sorted_row = NULL; int i,j; sorted_row = sort_array(piezas[myrow],SIZE_ROW ); printf("N mins : \n"); for(i=0;i 

我会尝试排序行,然后随机选择三个第一个元素中的一个。

 // 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] 

在tmp_array(8个元素)中创建一行的副本,然后在qsort(tmp_array) ,最后使用rand() % 3作为答案元素编号。

简单的解决方案是你有三个变量min1,min2,min3来保存三个最小变量。

取一个数组[3]并将这三个值保存在其中。现在

 int length = sizeof(numbers) / sizeof(int); int randomNumber = numbers[rand() % length]; 

一般来说,你可以使用heapsort来获取数组中的N个最小元素,例如你选择的行,你不需要对所有元素进行排序。但是请记住不要将排序结果保存在行本身中。 并使用rand()来获取其中一个。

 #include  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  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; }