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

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日

相关文章

  • python 面向对象之class和封装

    Python 面向对象之 class 和封装 Python 是一种面向对象的编程语言,使用面向对象的思想可以更好地组织和管理代码,提高代码的可维护性和可复用性。在 Python 中,class 是面向对象的重要组成部分,而封装则是实现面向对象的重要机制之一。 class class 是 Python 中面向对象编程的基础组成部分,可以通过 class 来定义…

    other 2023年6月25日
    00
  • Vue封装svg-icon组件使用教程

    下面是Vue封装svg-icon组件使用教程,包括: 前置知识点 svg文件的处理 封装svg-icon组件 使用封装的svg-icon组件 示例说明 总结 1. 前置知识点 在使用本文中的技术栈之前,需要掌握以下知识: Vue.js基础知识 webpack基础知识 ES6基础语法 2. svg文件的处理 在使用svg文件之前,需要进行一些处理: 将svg文…

    other 2023年6月25日
    00
  • android实现圆环倒计时控件

    Android实现圆环倒计时控件攻略 简介 圆环倒计时控件是一种常见的用户界面元素,用于显示倒计时的进度。在Android中,我们可以使用自定义视图(Custom View)来实现这个功能。本攻略将详细介绍如何实现一个圆环倒计时控件。 步骤 步骤一:创建自定义视图类 首先,我们需要创建一个自定义视图类来实现圆环倒计时控件。这个类将继承自View类,并重写on…

    other 2023年8月23日
    00
  • 易语言图形按钮控件的用法详解

    易语言图形按钮控件的用法详解 对于易语言程序员而言,实现图形界面操作是一个常见需求,此时图形按钮控件就成了必不可少的工具之一。本文将对易语言图形按钮控件的用法进行详解。 一、概述 图形按钮控件是一种用于图形界面中的按钮控件,它可以让用户通过单击按钮执行相应的操作。易语言中的图形按钮控件支持多种属性设置,包括按钮的位置、大小、文本、字体、背景色、前景色等。此外…

    other 2023年6月27日
    00
  • Vue3.0实现无限级菜单

    Vue3.0实现无限级菜单的攻略主要包含以下几个步骤: 1. 获取菜单数据 在 Vue3.0 中,我们可以使用 setup 函数来获取菜单数据。一般情况下,我们会将菜单数据放在一个数组中,然后从后台获取到数据后,再将其赋值给这个数组。示例代码如下: import { reactive } from ‘vue’; import axios from ‘axio…

    other 2023年6月27日
    00
  • JAVA定义变量与输出详解

    JAVA定义变量与输出详解 在JAVA编程中,定义变量和输出是非常基础且重要的概念。本攻略将详细讲解如何在JAVA中定义变量以及如何输出变量的值。 定义变量 在JAVA中,可以使用关键字int、double、boolean等来定义不同类型的变量。下面是一些常见的变量类型及其定义方式: int:用于表示整数类型的变量。例如,int age = 25;定义了一个…

    other 2023年8月9日
    00
  • 什么是ssrssr有什么用如何使用使用ssr

    什么是 SSR SSR (ShadowsocksR) 是基于 Shadowsocks 开发的一款科学上网工具。 SSR 与 Shadowsocks 最明显的区别在于 SSR 增加了对协议和混淆的支持。它不仅使用了 Shadowsocks 的加密和传输,而且还采用了更加复杂的混淆方式,使得 GFW 难以识别和封锁。 SSR 的优点和用途 能有效突破网络审查,访…

    其他 2023年3月28日
    00
  • h5plus/h5+规范使用 模块索引 教你如何去看h5+的手册

    h5plus/h5+规范使用 模块索引 教你如何去看h5+的手册 什么是H5+规范? H5+是一款基于HTML5标准的开发框架,也是目前主流移动端APP开发的选择。H5+提供了丰富的原生API接口,可以让开发者较为方便地完成应用开发的任务。H5+是由DCloud公司开发,得到了越来越多的开发者的支持。 H5+手册 为了帮助开发者更好地了解和使用H5+,DCl…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部