C语言:一个螺旋阵...

来源:百度知道 编辑:UC知道 时间:2024/06/15 10:53:45
怎么用递归来输出螺旋阵啊:
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
我看同学有这样的:
tian (0,0,1,n,n);
int tian(int x,int y,int i,int z,int n)
{
a[x][y]=i;
if((x<z-1)&&(y==n-z))
{
tian(x+1,y,i+1,z,n);
}
else if((x==z-1)&&(y<z-1))
{
tian(x,y+1,i+1,z,n);
}
else if((y==z-1)&&(x==z-1))
{
tian(x-1,y,i+1,z,n);
}
else if ((x<z-1)&&(y==z-1))
{
tian(x-1,y,i+1,z,n);
}
else if((x==n-z)&&(y==z-1))
{
z--;
tian(x,y-1,i+1,z,n);
}
else if((x==n-z)&&(y<z-1)&&(y>n-z))
{
tian(x,y-1,i+1,z,n);
}
else if((x==n-z)&&(y==n-z))
{
tian(x+1,y,i+1,z,n);
}
但是有问题...(也让人眼花...)
只要C的....
我只是想熟练递归啊...那位同志发挥下聪明才智.......

这里有个不用递归的建议:
    设计同样大小的状态矩阵,就象迷宫地图一样,初始化为没有墙壁;
    有 n * n 个递增的数 需要填补到 n * n 矩阵里,每取下一个数,需要计算它可以落入的下一个位置,这里只有两个索引位置,可以作为增量:行数、列数,而且这两个索引,在同一次循环里都只能单独增长,索引号小于等于数组的边界;
    找到位置以后,就可以往数组里填补数字,每当往数组里填一个数之后,还需要为以上提到的状态矩阵设置一个“墙壁状态”。当索引号已经在边界,或者下一个位置在状态矩阵里记录为“墙壁状态”,索引量的增加状态就要更换:
   比如现在,判断了一个 表示“增加状态”的标志量 Delta_F 过后,发现目标是:列号不变,增加行号。而且以上条件表明:下次将要更换“增加状态”,改变 Delta_F 的值,让下一次判断过后,就可以:行号不变,增加列号;
    所有需要填补的 n*n 个数都已经找到位置之后,就可以结束了。

关注