题目如下:
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
代码和注释如下
#include<stdio.h>
void setZeroes(int brr[3][3],int m,int n)
{
bool row = false, col = false;
//判断第一行有无0
for (int i = 0; i < n; ++i)
{
if (brr[0][i] == 0)
{
row = true;
}
}
//判断第一列有无0
for (int i = 0; i < m; ++i)
{
if (brr[i][0] == 0)
{
col = true;
}
}
//遍历除了首行首列的所有元素
for (int i = 1; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
if (brr[i][j] == 0)//如果有0
{
brr[0][j] = 0;
brr[i][0] = 0;
}
}
}
//遍历第一行 如果有0 那么对应的一列都变为0
for (int i = 1; i < n; ++i)
{
if (brr[0][i] == 0)
{
for (int j = 0; j < m; ++j)
{
brr[j][i] = 0;
}
}
}
//遍历第一列 如果有0 那么对应的一行都为0
for (int i = 1; i < m; ++i)
{
if (brr[i][0] == 0)
{
for (int j = 0; j < n; ++j)
{
brr[i][j] = 0;
}
}
}
if (row)//如果为真,把第一行元素全置为0
{
for (int i = 0; i < n; ++i)
{
brr[0][i] = 0;
}
}
if (col)//如果为真,把第一列全置为0
{
for (int i = 0; i < m; ++i)
{
brr[i][0] = 0;
}
}
}
int main()
{
int arr[3][3]={
1,1,1,1,0,1,1,1,1};
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
printf("-------------\n");
setZeroes(arr,3,3);//调用重置函数
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}
运行截图如下:
代码演示图如下: