C语言 - 螺旋方阵:运动算法求任意n阶螺旋方阵

本文介绍了一种用于生成n阶螺旋方阵的运动填充算法,详细解释了算法的思想,并提供了实例代码。该算法通过按顺序填充二维数组来创建螺旋形状的矩阵,适用于数学和计算机科学领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

如果你有任何不同看法,或更好的解决方案,可以留言给我,不吝赐教

 

【算法思想】

1、2、3、4、5、6... ... 按照数值的递增,依次判断每个值应该填在二维数组的那个位置(i, j)

简单说就是运动填充一个二维数组[n][n]的过程,要注意方向的控制,以及退出循环的时机。

【实例代码】 

/* 求任意n阶螺旋方阵:运动算法 */
#include <stdio.h>
#include <stdlib.h>
/* 定义空指针 */
#ifndef NULL
#define NULL    ((void *)0)
#endif
/* 宏:释放所有动态内存, 防止内存泄漏 */
#define FREE_ALL(data, i)   do {\
    for (i = 0; i < n; i++) {\
        if (data[i] != NULL) {\
            free(data[i]);\
        }\
    }\
    free(data);\
} while (0)
/* 定义运动方向 */
typedef enum {
    DIR_LEFT,
    DIR_RIGHT,
    DIR_UP,
    DIR_DOWN,
    DIR_MAX
}DIREC;
/* 函数声明 */
int **get_spiral_arr(int n);
int int_bits(int n);
/* 主函数 */
int main()
{
    int **data, n, i, j;
    /* 输入 */
    printf("输入阶数:\n");
    scanf("%d", &n);
    /* 获取螺旋方阵 */
    data = get_spiral_arr(n);
    if (data == NULL) {
        printf("failed.\n");
        system("pause");
        return 0;
    }
    /* 输出 */
    printf("%d阶螺旋方阵:\n\n", n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%*d ", int_bits(n * n), data[i][j]);
        }
        printf("\n");
    }
    /* 结尾处理 */
    FREE_ALL(data, i);
    printf("\n");
    system("pause");
    return 0;
}

/* 主要算法:n阶螺旋方阵 - 返回二维数组指针, NULL表示失败 */
int **get_spiral_arr(int n)
{
    int **ret, i, j, k;
    DIREC dir = DIR_RIGHT;
    /* 分配内存并初始化 */
    ret = (int **)malloc(n * sizeof(int *));
    if (ret == NULL) {
        return NULL;
    }
    for (i = 0; i < n; i++) {
        ret[i] = (int *)malloc(n * sizeof(int));
        if (ret[i] == NULL) {
            FREE_ALL(ret, i);
            return NULL;
        }
        memset(ret[i], 0, n * sizeof(int));
    }
    /* 填充数据: 运动算法(以下标的改变表示运动位置的变化) */
    for (i = 0, j = 0, k = 0; k < n * n; k++) {
        ret[i][j] = k + 1;
        switch (dir) {
        case DIR_LEFT:/* 向左运动 */
            if (--j < 0 || ret[i][j] != 0) {/* 运动到边界 */
                dir = DIR_UP;/* 改变方向 */
                j++;
                i--;
            }
            break;
        case DIR_RIGHT:/* 向右运动 */
            if (++j == n || ret[i][j] != 0) {
                dir = DIR_DOWN;
                j--;
                i++;
            }
            break;
        case DIR_UP:/* 向上运动 */
            if (--i < 0 || ret[i][j] != 0) {
                dir = DIR_RIGHT;
                i++;
                j++;
            }
            break;
        case DIR_DOWN:/* 向下运动 */
            if (++i == n || ret[i][j] != 0) {
                dir = DIR_LEFT;
                i--;
                j--;
            }
            break;
        default:
            FREE_ALL(ret, i);
            return NULL;
        }
    }
    
    return ret;
}
/* 计算一个十进制整数有多少位 */
int int_bits(int n)
{
    int i, ret;
    if (n == 0) {
        return 1;
    }
    for (i = n, ret = 0; i > 0; i /= 10) {
        ret++;
    }
    return ret;
}


 

转载请注明出处hi.baidu.com/公子迅,谢谢大家的支持 ^_^ 

文章 来自:

http://hi.baidu.com/%B9%AB%D7%D3%D1%B8/blog/item/f89e70137842cc1d4b90a720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值