【算法】——多维数组和矩阵 0所在的行列进行清0

如果矩阵中某个元素为0,则将其所在行和列清零

在解决这个问题的最开始我想的是遇到一个为0的就设那一行一列的为0,但是这样的话会导致在循环的时候进行下一次遍历时都为0的情况。

解题思路:

先扫一遍原始数组,在为0的位置用两个一维数组分别记录为0位置元素的行列

再扫一遍记录数组,如果其中任意一个是记录下为0的元素的下标的时候就把那个位置的原始数组置为0

#include<stdio.h>
void set0(int A[][200],int n,int m);
int main()
{
    int n,m,i,j;//记录矩阵的行和列
    int A[200][200];
    scanf("%d %d",&n,&m);
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            scanf("%d",&A[i][j]);
        }
     }
     set0(A,n,m); 
     
 } 
 void set0(int A[][200],int n,int m)
 {
     //先扫描一遍原本的数组
     int i,j;
     int hangR[200];
     int lieR[200];
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            //如果这个元素等于0,就用两个一维数组分别保存记录下标位置 
            if(A[i][j]==0)
            {
                //就将为0的元素的下标让hang 和lie两个数组分别保存
                hangR[i]=1;
                lieR[j]=1; 
             } 
        }
    }
    //接下来扫描记录的数组,将记录为1的下标(因为行和列是分开记录的,所以可以一行一列一起就置为0了)对应位置的元素都置为0
     for(i=0; i<n; i++)
     {
         for(j=0; j<m; j++)
         {
             //如果两个数组中有为1的就置为0
             if(hangR[i]==1||lieR[j]==1)
             {
                 A[i][j]=0;
              } 
         }
     }
     //循环打印
     for(i=0; i<n; i++)
     {
         for(j=0; j<m; j++)
         {
             printf("%d ",A[i][j]);
         }
         printf("\n");
      } 
 }

输入

输出

posted @ 2020-03-03 09:19  美好事物  阅读(38)  评论(0编辑  收藏