Question1.7:
Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are set to 0.1. 遍历一遍,记录下需要置零的行和列
2. 对已记录的行和列置零
代码:
#include <iostream>
#include <fstream>
bool ReadFile(int**, int, int);
void Output(int**, int, int);
void SetZero(int**, int, int);
int main()
{
using namespace std;
cout<<"Enter the width and height please"<<endl;
int width,height;
cin>>width>>height;
//Construct the matrix
if(width>0&&height>0)
{
int **mat = new int*[height];
for(int i=0;i<width;i++)
{
mat[i] = new int[width];
}
if(ReadFile(mat, width, height))
{
SetZero(mat, width, height);
Output(mat,width, height);
}
//delete
for(int i=0;i<width;i++)
{
delete[] mat[i];
}
delete[] mat;
}
}
//Read Matrix from file
bool ReadFile(int **mat, int width, int height)
{
using namespace std;
ifstream ifile;
ifile.open("input.txt");
if(!ifile)
{
cout<<"Open Unsuccess"<<endl;
return false;
}
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
ifile>>mat[i][j];
}
}
return true;
}
//Output the result through console
void Output(int **mat, int width, int height)
{
using namespace std;
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
cout<<mat[i][j]<<" ";
}
cout<<endl;
}
}
//Set rows and columns to be zero where there exists an element whose value is 0
void SetZero(int **mat, int width, int height)
{
int *heightmat = new int[height]();
int *widthmat = new int[width]();
//detect elements with value 0
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
if(mat[i][j]==0)
{
heightmat[i]=1;
widthmat[j]=1;
}
}
}
//set rows and columns to be 0
for(int i=0;i<height;i++)
{
if(heightmat[i]==1)
{
for(int j=0;j<width;j++)
{
mat[i][j]=0;
}
}
}
for(int i=0;i<width;i++)
{
if(widthmat[i]==1)
{
for(int j=0;j<height;j++)
{
mat[j][i]=0;
}
}
}
}