试题详情:
对于M行N的整数矩阵A,如果矩阵的某元素为零,请将它所在的行和所在的元素全部设置为零(注意:原来的零进行两个方向的传递,但新设置的零不进行二次传递)。请编写函数完成本功能(直接在原矩阵上修改),能否将空间复杂度控制在O(1)以内,即使用尽量少的辅助空间完成任务。
输入样例:
首行两个整数,表示矩阵的行,列数,余下有多行,每行有若干以空格分隔的整数。
4 5
1 2 3 0 5
2 3 4 5 6
3 4 5 6 7
0 5 6 7 8
输出样例:
输出原矩阵中有零的行和列均置成零以后的矩阵(由测试程序完成)。
0 0 0 0 0
0 3 4 0 6
0 4 5 0 7
0 0 0 0 0
函数接口定义:
void fun0 (int **A,int M,int N);//原矩阵中有零的行和列均置成零
其中 M
和 N
是矩阵的行,列数,矩阵可看成是由多个一维数组构成(数组构成的数组),故A
是一个二维指针。
/* 请在这里填写答案 */
1. C++一维数组 / 二维数组 / 三维数组 动态分配内存知识
// 一维数组动态申请,数组大小为n
int *a = new int[n];
// 二维数组动态申请,数组大小为 n*p
int **b = new int*[n];
for(int i=0; i<n; i++)
{
b[i] = new int[p];
}
// 三维数组动态申请, 数组大小为 m*n*p:
int ***c = new int **[m];
for(int i=0; i<m; i++)
{
c[i]=new int *[n];
for(int j=0; j<n; j++)
{
c[i][j] = new int [p];
}
}
C语言动态内存分配一维数组
//M、N 为数组长度
bool * row = (bool * ) malloc (N * sizeof(bool));
bool * col = (bool * ) malloc (M * sizeof(bool));
2.关于C++中bool类型变量知识
在 C++ 中使用 cout 输出 bool 变量的值时还是用数字 1 和 0 表示,而不是 true 或 false。
在C++中可使用true或false对bool变量进行定义。
3.bool类型动态分配一维数组
bool *row = new bool[N];
bool *col = new bool[N];
4.完整代码
void fun0 (int **A,int M,int N)//原矩阵中有零的行和列均置成零
{
bool* row = new bool[N];
bool* col = new bool[M];
for(int i=0;i<M;i++)
row[i] = 0;
for(int j = 0;j<N;j++)
col[j] = 0;
for(int i = 0;i<M;i++)
for(int j = 0;j<N;j++)
{
if(A[i][j] == 0)
{
row[i] = 1;
col[j] = 1;
}
}
for(int i = 0;i<M;i++)
for(int j = 0;j<N;j++)
{
if(row[i]==1 | col[j]==1)
A[i][j] = 0;
}
}
5.PTA完整代码
PTA上的试题采用C语言编程因此bool类型不能直接使用,也不支持C++动态内存分配方式,C语言代码如下:
#include <stdbool.h>//加入头文件使用bool类型
void fun0 (int **A,int M,int N)//原矩阵中有零的行和列均置成零
{
bool * row = (bool * ) malloc (N * sizeof(bool));
bool * col = (bool * ) malloc (M * sizeof(bool));
//bool *row = new bool[N];
//bool *col = new bool[M];
for(int i=0;i<M;i++)
row[i] = false;
for(int j = 0;j<N;j++)
col[j] = false;
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]==true | col[j]==true)
A[i][j] = 0;
}
}
6.总结与反思
本题使用C语言进行编程而非C++。