LeetCode-59. 螺旋矩阵

一、C实现

1. 参考
https://www.acoier.com/2021/03/15/54.%20%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5%EF%BC%88%E4%B8%AD%E7%AD%89%EF%BC%89/
注: 里面有多种解法

2. 递归实现

复制代码
#include <stdio.h>

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

int min_val(int x, int y) { return x < y ? x : y; }
int max_val(int x, int y) { return x > y ? x : y; }

/* 以矩阵左上角为原点,竖向下是x轴,水平向右为y轴 */
int circule(int mat[][4], int sz, int x1, int y1, int x2, int y2, int *arr, int idx)
{
    int i;

    /* 递归退出条件1-对应正方形矩阵 */
    if (x1 > x2 || y1 > y2) {
        printf("idx=%d\n", idx);
        return idx;
    }

    /* 递归退出条件2-对应长方形矩阵,长>高 */
    if (x1 == x2) {
        for (i = y1; i <= y2; i++) {
            arr[idx++] = mat[x1][i];
        }
        return idx;
    }

    /* 递归退出条件3-对应长方形矩阵,长<高 */
    if (y1 == y2) {
        for (i = x1; i <= x2; i++) {
            arr[idx++] = mat[i][y1];
        }
        return idx;
    }

    /* 记录当前圈 */
    for (i = y1; i < y2; i++) arr[idx++] = mat[x1][i];
    for (i = x1; i < x2; i++) arr[idx++] = mat[i][y2];
    for (i = y2; i > y1; i--) arr[idx++] = mat[x2][i];
    for (i = x2; i > x1; i--) arr[idx++] = mat[i][y1];
    
    /* 统计下一圈 */
    return circule(mat, sz, x1+1, y1+1, x2-1, y2-1, arr, idx);
}

#define MAT_CON 4

int main()
{
    int i, len;

    int mat[][MAT_CON] = {
        { 1,  2,  3,  4},
        {12, 13, 14,  5},
        {11, 16, 15,  6},
        {10,  9,  8,  7},
    };
    int arr[100];

    /* 传参时注意行列坐标 */
    len = circule(mat, ARRAY_SIZE(mat), 0, 0, ARRAY_SIZE(mat)-1, MAT_CON-1, arr, 0);

    for (i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    printf("len=%d\n", len);
    printf("ARRAY_SIZE(mat)=%lu\n", ARRAY_SIZE(mat)); //3
    
    return 0;
}
复制代码

 

posted on   Hello-World3  阅读(1)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-02-17 battery-historian V2.0的数据获取及参数分析
2020-02-17 /sys/power/pm_async 文件解读
2019-02-17 JNI学习笔记_C调用Java

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示