问题描述:
输出下图所示N×N(N≥1)的数字旋转方阵。要求:采用递归法实现。
提示:注意观察A、B、C、D四个区域。
核心思想:
先用数组a[i][j]存储数字num(从1至N2),然后打印。
递归函数作用:
n=0:结束递归
n=1:存入最后一个数字(N2);
n>1:分别按粉蓝红黄四个方向,用四个for循环将num存于第i行第j列即二维数组a[i][j]中。
代码如下:
#include<stdio.h>
int a[11][11],i,j,num,size;
int xuanzhuan(int n)
{
if(n==0)return 0;
if(n==1)
{
a[i][j]=num++;
return 0;
}
for(int k=1;k<n;k++,i++)//粉色方向
a[i][j]=num++;
for(int k=1;k<n;k++,j++)//蓝色方向
a[i][j]=num++;
for(int k=1;k<n;k++,i--)//红色方向
a[i][j]=num++;
for(int k=1;k<n;k++,j--)//黄色方向
a[i][j]=num++;
i++; //注意用i++和j++来调整下一次递归时的起点
j++; //第一圈的起点为图中的1位置,第二圈的起点为图中21位置,第三次在33
xuanzhuan(n-2); //下次循环时边长-2
}
int main()
{
i=j=1;
num=1;
printf("请输入旋转数组的边长(1到10之间):\n");
scanf("%d",&size);
xuanzhuan(size);
for(int i=1;i<=size;i++)//打印存储好的数组
{
for(int j=1;j<=size;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
}