如果MxN矩阵中的元素为0,则其整个行和列都设置为0

时间:2016-10-16 16:47:14

标签: c++

void zero(int a[][4],int m,int n){
bool row[m], col[n];
memset(row,false,sizeof(row));
memset(col,false,sizeof(col));
for(int i = 0;i<m;i++)
{
    for(int j= 0;j<n ; j++ )
    {
    if(a[i][j]==0){
        row[i]=true;
        col[j]=true;
    }    
    }
}
for(int i=0;i<m;i++){
    for(int j=0;j<n;j++){
        if(row[i] || row[j])
        a[i][j]=0;
    }
} 

}
int main(){
int a[][4]={
{1,2,3,4},
{1,2,4,5},
{4,0,6,7},
{3,6,3,56},
}
zero(a,4,4);
for(int i = 0 ; i<4;i++){
for(int j = 0;j < 4 ; j++){
    cout << a[i][j]<<" " ;
}cout <<endl;
}
}

编写一种算法,使得如果MxN矩阵中的元素为0,则将其整个行和列设置为0。    所以这是我的代码。你可以看到a [2] [1] = 0,所以第2行和第1列应该是0.但我的结果是第2行,第2列是0。真的很困惑......请帮忙

3 个答案:

答案 0 :(得分:2)

如果您在遍历过程中在行或列中发现0时立即开始用0替换行和列,那么最终整个数组将变为零。

正确的解决方案是在遍历数组时将索引对存储(行,列),然后在遍历完成后使用这些对逐个更改数组。

array = [
          [1 , 2, 3],
          [4 , 5, 0],
          [7 , 8, 9]
        ]

indices_pairs = [(row,col) for row in range(len(array)) for col in range(len(array[0])) if array[row][col] == 0]


for indices_pair in indices_pairs:
    row, col = indices_pair

    for i in range(len(array[0])):
    array[row][i] = 0

    for i in range(len(array)):
    array[i][col] = 0


print(array)

[
 [1 , 2, 0],
 [0 , 0, 0],
 [7 , 8, 0]
]

答案 1 :(得分:0)

这是一个简单的解决方案:

public static void setZeros(int[][] matrix) {
    int[] row = new int[matrix.length];
    int[] column = new int[matrix[0].length];
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {
            if (matrix[i][j] == 0) {
                row[i] = 1;
                column[j] = 1;
            }
        }
    }
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {
            if ((row[i] == 1 || column[j] == 1)) {
                matrix[i][j] = 0;
            }
        }
    }
}

答案 2 :(得分:-1)

你调用一个函数来验证你的元素是否为零,如果它们被替换为“true”,那么在这个函数中你测试是否存在这些元素,如果它们确实存在,则将它们设置为零,当然一切都会是零;)