如果矩阵中某个元素为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"); } }
输入
输出
原文:https://www.cnblogs.com/jessie99/p/12400519.html