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 2025-02-17 14:39  Hello-World3  阅读(7)  评论(0)    收藏  举报

导航