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

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

【算法思想】

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

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

【实例代码】

/* 求任意n阶螺旋方阵:运动算法 */

#include

#include

/* 定义空指针 */

#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/公子迅,谢谢大家的支持 ^_^

文章 来自:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值