递归算法画螺旋数组,大致思想:螺旋每一圈可以看成一个子问题,只需要知道该圈左上角的数值大小以及该圈的长度就可以填充该圈的所有值。程序从最外圈开始,递归到最内圈,再一次从内到外填充响应的值。
#include <stdio.h> #include <stdlib.h>
/***************************
s: 二维数组
pos: 第几圈
val: 该圈左上角数值
len: 该圈长度
****************************/ void draw(int **s, int pos, int val, int len) { if(len<=0) return;
int npos = pos + 1; int nlen = len - 2; int nval = val + 4*len -4; draw(s, npos, nval, nlen);
int i,lval=val,row=pos, col=pos; for(i=0;i<len;i++) { s[row][col++] = lval++; } col--; row++; for(i=0;i<len-1;i++) { s[row++][col] = lval++; } row--; col--; for(i=0;i<len-1;i++) { s[row][col--] = lval++; } col++; row--; for(i=0;i<len-2;i++) { s[row--][col] = lval++; } } int main() { int n = 0; scanf("%d", &n);
int **tank = NULL; tank = (int **)malloc(n*sizeof(int *)); int i; for(i=0;i<n;i++) { tank[i] = (int *)malloc(n*sizeof(int)); }
int x,y; for(x=0;x<n;x++) { for(y=0;y<n;y++) { tank[x][y] = 0; } }
draw(tank, 0, 1, n); for(x=0;x<n;x++) { for(y=0;y<n;y++) { printf("%4d ", tank[x][y]); } printf("\n"); }
return 0; }
|
阅读(1245) | 评论(0) | 转发(0) |