PTA矩阵置零

试题详情:

        对于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++。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值