当前位置: 首页 > article >正文

C语言 | Leetcode C语言题解之第542题01矩阵

题目:

题解:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
typedef struct{
    int x;
    int y;
}coordinate;//坐标结构体


int** updateMatrix(int** mat, int matSize, int* matColSize, int* returnSize, int** returnColumnSizes){

    int dx[4]={-1,0,1,0};//用作坐标偏移
    int dy[4]={0,-1,0,1};

    //新建队列,存放坐标数组
    coordinate* queue=(coordinate*)malloc(sizeof(coordinate) * 10240);
    int front=0;
    int rear=0;

    //设置结果数组返回值
    *returnSize=matSize;
    *returnColumnSizes=matColSize;//returnColumnSizes是一个二级指针,解引用之后是一个一级指针,可以直接等于
    
    //定义二级指针,申请空间构建二维数组当结果
    int** result=(int**)malloc(sizeof(int*) * matSize);//申请matSize个空间存储每一个行指针
    for(int i=0;i<matSize;i++)
    {
        //result[i]=(int*)malloc(sizeof(int) * (*matColSize)); 
        *(result+i)=(int*)malloc(sizeof(int) * (*matColSize));//给行指针申请*matColSize个空间
        
        //初始化二维数组--原数组为0的地方初始化为0,为1的地方初始化化为max,方便后面进行距离比较
        for(int j=0;j<*matColSize;j++)
        {
            if(mat[i][j]==0)
            {
                result[i][j]=0;
                queue[rear].x=i;
                queue[rear].y=j;//将该坐标入队
                rear++;//队尾指针后移一位,指向空
            }
            else
            {
                result[i][j]=INT_MAX;//INT_MAX --> 整数类型所能表达的最大值
            }
        }
    }

    
    //开始进行广度优先搜索
    int x,y;//扩散后的坐标
    while(front!=rear)
    {
        for(int i=0;i<4;i++)
        {
            x=queue[front].x+dx[i];
            y=queue[front].y+dy[i];
            
            if(x>=0 && x<matSize && y>=0 && y<*matColSize)
            {
                //result[x][y]为INT_MAX的时候
                if(result[x][y] > result[queue[front].x][queue[front].y]+1)
                {
                    result[x][y] = result[queue[front].x][queue[front].y]+1;
                    queue[rear].x=x;//将新的已经被赋值所求距离的位置坐标入队
                    queue[rear].y=y;
                    rear++;
                }
            }
        }
        front++;//队列头指针后移,接着往后遍历
    }
    return result;
}

http://www.kler.cn/a/384553.html

相关文章:

  • C++ | Leetcode C++题解之第542题01矩阵
  • 【C/C++】strncpy函数的模拟实现
  • 将自己的项目打包成一个docker发布
  • 美格智能5G车规级通信模组:高精度定位守护极致安全
  • esp32记录一次错误
  • git撤销commit和add
  • 正则表达式在Kotlin中的应用:提取图片链接
  • Istio Gateway发布服务
  • 一文了解Android的Doze模式
  • 前端开发设计模式——原型模式
  • Linux文件系统详解
  • 【Axure高保真原型】视频列表播放器
  • 计算机网络-以太网小结
  • Hive中各种Join的实现
  • Windows系统使用OpenSSL生成自签名证书
  • pnpm管理多工作区依赖
  • Oracle-日期转换
  • 数据结构-数组(稀疏矩阵转置)和广义表
  • 【全网最新】Pycharm安装 并完成正常使用 Anaconda3最新版安装教程 搭配Pycharm 调试Anaconda3
  • Django设计响应数据结构
  • web前端
  • navicat pg库安装mysql fdw 外表扩展
  • Call For Speaker! |2025中国国际音频产业大会(GAS)演讲嘉宾征集令启动!
  • 后端Node学习项目-项目基础搭建
  • linux下linuxdeployqt打包过程
  • Xserver v1.4.2发布,支持自动重载 nginx 配置