您的位置:首页 > 编程语言 > C语言/C++

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

2011-10-23 13:32 232 查看
如果你有任何不同看法,或更好的解决方案,可以留言给我,请不吝赐教!

【算法思想】

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: