C语言 经典题目螺旋矩阵 实例详解

yizhihongxing

C语言 经典题目螺旋矩阵 实例详解

问题描述

给定一个正方形的矩阵,要求以从左上角开始,顺时针方向遍历所有元素,按照遍历顺序存储到一个一维数组中。如下图所示,对于输入的矩阵 arr,应输出一个一维数组 res,其中res = {1, 2, 3, 6, 9, 8, 7, 4, 5}。

1   2   3
4   5   6
7   8   9

解题思路

我们可以定义一个方向数组dir,dir数组中的四个元素分别表示上下左右四个方向。通过不断更新当前位置curRow、curCol,以及当前方向currentDir,来实现按照遍历顺序输出各个元素。

具体的实现方式可以参考下面的代码:

void print(int **arr, int n) {
    int *res = (int*)malloc(sizeof(int)*n*n);
    int curRow = 0, curCol = 0, k = 0;
    int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};//上右下左
    int currentDir = 1; //当前方向初始为向右
    int visited[n][n];//记录该位置是否已经被访问
    memset(visited, 0, n*n*sizeof(int));//初始所有位置均未访问
    while(k < n*n) {//遍历所有元素
        res[k++] = arr[curRow][curCol];
        visited[curRow][curCol] = 1; //标记当前位置已经访问
        int nextRow = curRow + dir[currentDir][0], nextCol = curCol + dir[currentDir][1];
        if(nextRow >= 0 && nextRow < n && nextCol >= 0 && nextCol < n && !visited[nextRow][nextCol]) {//判断下一个访问位置是否越界或已经访问
            curRow = nextRow; curCol = nextCol;//更新当前位置
        } else {//如果越界或者已经访问,则需要更换方向
            currentDir = (currentDir + 1) % 4;//更换方向
            curRow += dir[currentDir][0]; curCol += dir[currentDir][1];//更新当前位置
        }
    }
    for(int i = 0; i < n*n; i++)
        printf("%d ", res[i]);
    printf("\n");
}

示例说明

针对矩阵:

1   2   3
4   5   6
7   8   9

使用上述代码执行 print(arr, 3) 函数,则会得到输出:1 2 3 6 9 8 7 4 5。

再举一个例子,针对矩阵:

1   2
3   4

使用上述代码执行 print(arr, 2) 函数,则会得到输出: 1 2 4 3。

总之,对于任意输入的正方形矩阵,都能够正确地输出按照遍历顺序存储到一维数组中的元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 经典题目螺旋矩阵 实例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue axios接口请求封装方式

    下面是关于Vue中Axios接口请求封装的完整攻略。 1. 为什么要封装Axios请求 Vue中Axios是一个非常流行的HTTP请求库,它可以实现异步数据的请求,并且可以在各个组件中使用,非常方便。但是,在实际开发中,由于请求的参数较多,请求方式较为复杂,并且需要对请求结果进行处理,所以,在大型项目中需要封装Axios请求方式,以便于更好地维护和管理代码。…

    other 2023年6月25日
    00
  • C++ 头文件系列(set)详解

    下面我将详细讲解 “C++ 头文件系列(set)详解” 的完整攻略,包括概念、语法、使用场景和示例说明。 一、概念 在 C++ 中,头文件是一个包含 C++ 语句和声明的文件,通常包含在源文件中,从而允许代码模块化。头文件通常包含一些宏定义、全局变量和结构,可以被其它源文件共享。set 头文件是其中之一,提供了 STL 中的 set 容器用于存储一些无序的数…

    other 2023年6月27日
    00
  • coreldraw(cdr)2018安装教程详解

    CorelDRAW 2018安装教程详解 1. 检查系统要求 在安装 CorelDRAW 2018 之前,需要先检查系统是否符合最低系统要求。以下是 CorelDRAW 2018 的最低系统要求: 操作系统:Windows 7 SP1、Windows 8.1 或 Windows 10,32 位或 64 位版本; 处理器:Intel Core i3/5/7 或…

    其他 2023年4月16日
    00
  • vue+elementUI面包屑组件封装方法详解

    下面是“vue+elementUI面包屑组件封装方法详解”的攻略: 一、什么是面包屑组件及其用途 在前端开发中,面包屑组件是一种比较常见的页面导航方式,它可以帮助用户了解自己当前所处的位置,能够提高用户的使用友好度。例如,在一个电商网站中,用户在不同的分类页面浏览商品时,面包屑能够方便地帮助用户返回到上级分类页面。 在 Vue + ElementUI 中,E…

    other 2023年6月25日
    00
  • ORACLE EXP不能导出空表的原因分析及解决方法

    Oracle EXP不能导出空表的原因分析及解决方法 问题描述 在使用Oracle EXP工具导出数据库时,发现无法导出空表,命令如下: exp user/pass@instance tablespaces=users file=users.dmp log=users.log 执行该命令时,提示以下错误: EXP-00008: ORACLE error 90…

    other 2023年6月27日
    00
  • stm32系列芯片命名规范

    STM32系列芯片命名规范 简介 STM32是意法半导体的一款32位微控制器芯片,它在嵌入式控制领域应用广泛,提供了出色的性能、低功耗和多种功能。作为一款优秀的芯片,STM32的命名规范十分重要,它有助于开发者快速选择适合自己开发需求的芯片。 命名规则 STM32系列芯片的命名规则通常包括四部分: 系列类型:用2~3个字母加数字表示。如STM32F1、STM…

    其他 2023年3月28日
    00
  • C#实现代码移除窗体上的控件

    下面我将详细讲解“C#实现代码移除窗体上的控件”的完整攻略。 思路 要实现移除窗体上的控件,我们需要做以下两个步骤: 从窗体控件集合中移除要移除的控件; 调用控件的 Dispose() 方法释放资源。 下面我们将详细分步讲解。 1. 从窗体控件集合中移除要移除的控件 在窗体上移除控件,我们需要从窗体的控件集合中移除要移除的控件。C# 中,每个控件都有一个 C…

    other 2023年6月26日
    00
  • iOS 14.2/iPadOS14.2 Beta4值得升级吗?iOS 14.2/iPadOS14.2 Beta4更新详解

    iOS 14.2/iPadOS 14.2 Beta 4 值得升级吗? 简介 iOS 14.2/iPadOS 14.2 Beta 4 是苹果公司最新发布的测试版本,旨在为iPhone和iPad用户提供更好的使用体验。在决定是否升级之前,我们需要考虑以下几个因素。 新功能和改进 iOS 14.2/iPadOS 14.2 Beta 4 带来了一些新功能和改进,这些…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部