Chinaunix首页 | 论坛 | 博客
  • 博客访问: 221051
  • 博文数量: 38
  • 博客积分: 2060
  • 博客等级: 大尉
  • 技术积分: 388
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-17 10:10
文章分类

全部博文(38)

文章存档

2011年(1)

2009年(37)

我的朋友

分类: C/C++

2009-08-12 15:32:06

递归算法画螺旋数组,大致思想:螺旋每一圈可以看成一个子问题,只需要知道该圈左上角的数值大小以及该圈的长度就可以填充该圈的所有值。程序从最外圈开始,递归到最内圈,再一次从内到外填充响应的值。
 

#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) |
给主人留下些什么吧!~~