【问题标题】:Deleting rows and columns from matrix in C从C中的矩阵中删除行和列
【发布时间】:2021-05-17 17:26:02
【问题描述】:

我的任务是从矩阵中删除相同的行和列,而不删除第一个相同的行/列。例如,如果第二行、第三行和第四行相同,则应删除第三行和第四行,并保留第二行。列也是如此。我试图解决这个任务,但是,我的代码有一些错误,我不知道我的方法是否正确。我希望你能帮助我。

#if 0
Sample Input:
1 2 1 2 3
1 2 1 2 3
1 2 1 2 3
   
Sample Output:
1 2 3
#endif

#include <stdio.h>

int main()
{
    int M, N, m[100][100], i, j, a = 0, k, b = 0;

    printf("Enter dimensions: ");
    scanf("%d %d", &M, &N);

    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            scanf("%d", &m[i][j]);
        }
    }

    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            if(m[i][j] != m[a][j])
            {
                a++;
                continue;
            }

            if(m[i][j] != m[b][j])
            {
                b++;
                continue;
            }

            if(i == M)
            {
                for(i = 0; i < M; i++)
                {
                    m[i][k] = m[i][k + 1];
                }
                N--;
            }

        }
        if(j == N)
        {
            for(k = 0; k < N; k++)
            {
                m[i][k] = m[i + 1][k];
            }
            M--;
        }

    }

    printf("New matrix: \n");
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            printf("%d", m[i][j]);
        }
        printf("\n");
    }
}

【问题讨论】:

  • 如果您提供测试输入会很棒。
  • “删除”到底是什么意思?你的意思是用零替换值吗?对任何试图回答的人都有帮助的是样本输入以及样本输入的预期输出。
  • @asuka 我已经包含了示例
  • @Tom 我想因为在示例中第一、第二和第三行是相同的,所以应该删除第二和第三行,然后输出将是 1 2 1 2 3 - 为什么它会转到1 2 3?
  • @asuka 因为同样的规则也适用于列

标签: arrays c matrix


【解决方案1】:

我假设您有一个函数,它接收数组 A 和 B 的基指针,如果它们相同则返回 true。例如。

bool are_identical(int* A, int* B, int len); // true if A[i] = B[i], for all 0 &lt;= i &lt; len

我假设有很多删除,所以更好的选择是拥有一个指向指针的指针数组(指向每行的基本 ptr)而不是拥有一个 2D 数组。因为删除相当简单,因为您只需要释放(解除分配)某一行并将基本 ptr 从当前位置开始移动一个位置。这是 O(row) 最差的时间复杂度。

int** array_of_base_ptr;

// generate k new rows

for(int i=0; i < k; i++) {
    int* arr = (int*) malloc(SIZE_OF_ARRAY * sizeof(int));
    array_of_base_ptr[k] = arr;
}
 
/*
 SOME OTHER CODE
*/


if (are_identical(array_of_base_ptr[i], array_of_base_ptr[j], SIZE_OF_ARRAY)) {
   free(array_of_base_ptr[j]); // j = i + 1

   /* 
      followed by code to shift everything one row back 

      something like this:

      array_of_base_ptr[j] = array_of_base_ptr[j+1]; for all j > i

   */

}

但是如果你真的有很多删除,最好有一个链表类型的数据结构(存储每行的基本 ptr),其中删除是 O(1),因为你只需要删除一个单个节点。

【讨论】:

  • 不允许使用函数查找共同元素
  • 没关系,我试着让代码模块化,你可以把那个函数的代码放在main()函数中或者更好地使用c++的lambda函数。
猜你喜欢
  • 2019-07-08
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2013-07-22
  • 1970-01-01
  • 2013-03-03
  • 2021-11-14
相关资源
最近更新 更多