0

几个小时前我提出了一个问题,但是在完成我对该问题提出的问题后,我对自己必须做的事情感到一团糟。人们给我的所有解决方案都还可以,但是对于我真正想要的东西没有用,因为我没有写出必须的问题。我必须保存一个值的重要位置,没有必要保存在另一个问题上来解决问题。所以这里是正确的。

(一切都用上面的例子解释,理解起来很容易)我有一个 8x8 矩阵,在选择我想要的行之后,我想得到它的三个最小元素,并随机选择这三个中的一个。然后,删除包含此数字的行和列。问题是我不知道如何处理这三个元素并删除列/行。我只知道如何获得最小元素,即以下代码。

int pieza[ROWS][COLS] = {
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,
0, 1, 3, 2, 0, 0, 0, 0,
};

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);

这就是我想做的。如果初始矩阵是(始终是nxn矩阵):

{
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,
0, 1, 3, 2, 0, 0, 0, 0,
};

我选择第 3 行:

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

该算法必须选择该行的三个最小元素。

0, 1, 1

并随机选择这三个之一。例如,如果它选择第一个“一个”......

0, **1**, 1

...算法必须转到该行的第 3 列(因为那是 '1' 的位置)并删除行和列,因此输出矩阵将如下所示,比原始矩阵少一维(因为您已经删除了一行和一列):

    {
    0, 2, 5, 3, 2, 1, 1,
    0, 4, 2, 4, 3, 0, 0,
    0, 4, 2, 1, 2, 3, 2,
    2, 5, 5, 3, 1, 2, 7,
    8, 2, 0, 0, 2, 1, 1,
    1, 2, 1, 1, 6, 3, 4,
    0, 1, 2, 0, 0, 0, 0,
    };

我只知道如何到达线路,但我在处理三个最小值时遇到了问题,因为我有大量的问题指针,而且我对 C 的了解不多。
提前致谢

4

3 回答 3

1
#include <stdio.h>
#include <string.h>

#define SIZE 8

void delrow(int a[SIZE][SIZE], int row){
    if(row < SIZE - 1)
        memmove(&a[row], &a[row+1], (SIZE*SIZE - SIZE*(row+1))*sizeof(int));
};
void delcol(int a[SIZE][SIZE], int col){
    int r;
    if(col < SIZE - 1){
        for(r=0;r<SIZE;++r){
            memmove(&a[r][col], &a[r][col+1], (SIZE - (col+1))*sizeof(int));
        }
    }
}

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,
        0, 1, 3, 2, 0, 0, 0, 0,
    };
    //test
    int row = 8, col = 8;
    int r,c;
    delrow(piezas, 3);
    row -= 1;
    for(r=0;r<row;++r){
        for(c=0;c<col;++c)
            printf("%2d", piezas[r][c]);
        printf("\n");
    }
    printf("\n");
    delcol(piezas, 1);
    col -= 1;
    for(r=0;r<row;++r){
        for(c=0;c<col;++c)
            printf("%2d", piezas[r][c]);
        printf("\n");
    }
    return 0;
}
/* result
 0 2 2 5 3 2 1 1
 0 4 5 2 4 3 0 0
 0 4 2 2 1 2 3 2
 2 5 6 5 3 1 2 7
 8 2 0 0 0 2 1 1
 1 2 2 1 1 6 3 4
 0 1 3 2 0 0 0 0

 0 2 5 3 2 1 1
 0 5 2 4 3 0 0
 0 2 2 1 2 3 2
 2 6 5 3 1 2 7
 8 0 0 0 2 1 1
 1 2 1 1 6 3 4
 0 3 2 0 0 0 0
*/
于 2013-05-13T11:34:05.337 回答
1

以列数排序的示例。

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

typedef struct pair {
    int value, column;
} Pair;

int cmp(const void *a, const void *b){
    Pair *pa = (Pair *)a;
    Pair *pb = (Pair *)b;
    return pa->value - pb->value;
}

int main(void){
    int data[8] = {0, 3, 1, 5, 1, 2, 3, 4};
    Pair data_pair[8];
    int i;
    for(i=0;i<8;++i){
        data_pair[i].value = data[i];
        data_pair[i].column = i;
    }
    qsort(data_pair, 8, sizeof(Pair), cmp);
    for(i=0;i<3;++i)
        printf("value = %d, column = %d\n", data_pair[i].value, data_pair[i].column);
    return 0; 
}
/* result
value = 0, column = 0
value = 1, column = 2
value = 1, column = 4
*/
于 2013-05-14T09:16:17.347 回答
0

下面是从选定行中获取第 n 个最小元素的摘录 - 您在删除行和列之前的第一个要求。

  1. 复制行
  2. 对复制的行进行排序(排序时也保存索引)
  3. 排序索引表示排序顺序中值的位置
  4. 选择索引排序索引的第 0 或第 1 或第 n 分钟。

------------ 非常草稿代码 ---- 尝试优化 --------

#include <stdio.h>
#include<memory.h>

void sortIndex(int *array, int *arrayIdx)
{
 int i=0,j=0;
 int temp=0;

 int tempArr[4];

 memcpy(tempArr, array, 4*sizeof(int));
 for(i=0;i<4;i++)
 {
  printf("%d ",tempArr[i]);
 }
 printf("\n");

  for(i=0;i<4;i++)
  {
    for(j=i+1;j<4;j++)
    {
      if(tempArr[i]>tempArr[j])
      {
       temp = arrayIdx[i];
       arrayIdx[i]=arrayIdx[j];
       arrayIdx[j]=temp;

       temp = tempArr[i];
       tempArr[i]=tempArr[j];
       tempArr[j]=temp;
      }
    }
  }
 printf("Sorted array Index\n");
 for(i=0;i<4;i++)
 {
  printf("%d ",arrayIdx[i]);
 }
 printf("\n");
 printf("Sorted array Value\n");
 for(i=0;i<4;i++)
 {
  printf("%d ",array[arrayIdx[i]]);
 }
 printf("\n");
}


int main ()
{
 int array[4][4] = {{4,3,2,1},{7,5,4,3},{6,5,4,4},{5,5,2,1}};
 int sortedIdx[4] = {0,1,2,3};
 int i,ii;

 for(i=0;i<4;i++)
 {
   for(ii=0;ii<4;ii++)
      printf("%d ",array[i][ii]);
   printf("\n");
 }

 printf("(Note:Count from 0). Which Row : ");
 scanf("%d",&i);
 sortIndex(array[i],sortedIdx);

 printf("\n");

 printf("(Nth smallest value)Give a N value (0 to 3): ");
 scanf("%d",&ii);
 printf(" (%d)  smallest value in row (%d) is (%d)\n",ii,i,array[i][sortedIdx[ii]]);

 printf("Now call function to remove Row (%d) and column (%d)\n",i,sortedIdx[ii]);

 return 0;
}
于 2013-05-21T07:43:21.983 回答