C语言 - 螺旋方阵:运动算法求任意n阶螺旋方阵
2011-10-23 13:32
232 查看
如果你有任何不同看法,或更好的解决方案,可以留言给我,请不吝赐教!
【算法思想】
1、2、3、4、5、6... ... 按照数值的递增,依次判断每个值应该填在二维数组的那个位置(i, j)
简单说就是运动填充一个二维数组
的过程,要注意方向的控制,以及退出循环的时机。
【实例代码】
转载请注明出处hi.baidu.com/公子迅,谢谢大家的支持 ^_^
文章 来自:
http://hi.baidu.com/%B9%AB%D7%D3%D1%B8/blog/item/f89e70137842cc1d4b90a720.html
【算法思想】
1、2、3、4、5、6... ... 按照数值的递增,依次判断每个值应该填在二维数组的那个位置(i, j)
简单说就是运动填充一个二维数组
的过程,要注意方向的控制,以及退出循环的时机。
【实例代码】
/* 求任意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
相关文章推荐
- 用C语言实现顺时针螺旋方阵的打印(含算法)
- c语言螺旋方阵逆时针旋转
- c语言螺旋方阵順时针旋转(数组版)
- java实现螺旋方阵或者折叠方阵的算法
- C/C++实现螺旋方阵算法
- C语言 螺旋方阵的生成方法分析
- c语言螺旋方阵順时针旋转
- 一类螺旋方阵问题的算法分析与实现
- C语言作业|螺旋方阵
- n*n螺旋方阵的C语言实现
- C语言之基本算法29—整数任意次方的最后三位数(精度问题)
- 山东理工大学ACM平台题答案关于C语言 1295 螺旋方阵
- 海龟算法求解螺旋方阵
- c语言任意格式输入提取算法
- SVD(奇异值分解)算法_计算任意N*M矩阵_C语言代码
- 算法系列——机器人的运动范围
- C语言的一些基本算法
- BZOJ 2547(匈牙利算法-任意边的处理)
- 任意运动框架
- {C语言算法}排列组合