(C ++)删除矩阵错误中具有重复项的行

时间:2019-01-27 12:34:40

标签: c++ arrays debugging matrix

从矩阵中删除两次遇到某个值的行。我已经编写的代码中的错误在哪里,这样就可以在不使用任何函数或任何使其更容易的地方进行操作? 我的代码:

#include <iostream>

using namespace std;

int main()
{
    int v[99][99], m, n, i, j, k, vlinie[99], a=0;

    cout<<"m="; cin>>m;
    cout<<"n="; cin>>n;
    for(i=1; i<=m; i++)
        for(j=1; j<=n; j++)
            cin>>v[i][j];

    //finding out each row that has doubles and remembering its index in an array called vlinie
    for(i=1; i<=m; i++)
        for(j=1; j<=n-1; j++)
            for(k=j+1; k<=n; k++)
                if(v[i][j]==v[i][k])
                    {
                        a++; //a is the number of numbers in vlinie
                        vlinie[a]=i;
                    }

    //removing duplicates from vlinie, in case there are any
    for(i=1; i<=a-1; i++)
        for(j=i+1; j<=a; j++)
            if(vlinie[i]==vlinie[j])
                for(k=i; k<=m; k++)
                {
                    vlinie[k]=vlinie[k+1];
                    a--;
                }

    //this is where we move the rows around, and supposedly the line where i got it wrong, so what do i change in this line?
    for(i=1; i<=a; i++)
        for(j=1; j<=n; j++)
            for(k=vlinie[i]; k<=m; k++)
                v[vlinie[i]+k][j]=v[vlinie[i]+k+1][j];

    for(i=1; i<=m; i++)
        {
            cout<<endl;
            for(j=1; j<=n; j++)
                cout<<v[i][j]<<" ";
        }

    return 0;
}

示例:

1 2 2 3
4 5 6 7
7 7 8 9
7 6 5 4

其输出内容:

4 5 6 7
7 6 5 4
0 0 0 0 0 0 0 0(理论上没有零,但是我写它的方式目前还是这样)

它输出的内容:

1 2 2 3
7 7 8 9
5 4 3 2(它没有删除应删除的行,而是删除了应保留的行)

该如何解决?

PS:是的,我知道我不应该从1而不是0开始索引,无需再次提醒我

1 个答案:

答案 0 :(得分:0)

您的问题出在以下几行:

CAGradientLayer

索引是第一个问题:我们应该将 for(i=1; i<=a; i++) for(j=1; j<=n; j++) for(k=vlinie[i]; k<=m; k++) v[vlinie[i]+k][j]=v[vlinie[i]+k+1][j]; 复制到v[k+1][]
第二个问题是,一旦执行了第一步,表v[k][]就不再有效。
最后一点不是那么容易纠正。

此外,对于每个受抑制的行,您都将实现几行的移位,这会导致效率低下。

记住被抑制的行(vlinie)并从此表中确定输入矩阵的哪一行将在最终矩阵的第i行(表{{1 }})。

以下是实施示例。

suppress[]