查找值后删除矩阵的行和列(C)

时间:2013-05-13 10:55:22

标签: c matrix row

我几个小时前做了a question但是在完成我对这个问题的询问之后,我弄得一团糟。人们给我的所有解决方案都很好,但对于我真正想要的东西却毫无用处,因为我没有写出问题。我要保存一个重要的价值位置,并没有必要保存在另一个问题上以解决问题。所以这是正确的。

(一切都用上面的例子解释,理解它很简单)我有一个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'的位置)并删除行和列,因此输出矩阵将如下所示,一维小于原始矩阵(beucase你删除了一行和一列):

    {
    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的要求不高。
提前致谢< / p>

3 个答案:

答案 0 :(得分: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
*/

答案 1 :(得分: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
*/

答案 2 :(得分:0)

以下是从所选行中获取第n个最小元素的提取 - 删除行和列之前的第一个要求。

  1. 复制行
  2. 对复制的行进行排序(在排序时也保存索引)
  3. 排序索引表示按排序顺序排列的值
  4. 选择索引排序索引的第0或第1或第n分钟。
  5. ------------非常草案代码----尝试优化-------

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