方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
#include <stdio.h>
#define N 20 //最大输入20
//分别代表3种填充路径
#define ONE 1 //横向填充
#define TWO 2 //从右上到坐下填充
#define THREE 3 //从下到上填充
void setnext(int m,int arr1[][N],int arr2[][N],int x,int y,int f);
void main()
{
int n,num,i,j;
int a[N][N]; //要填充的数组
int b[N][N]; //表示数组a中对应位置上是否可以填充,1代表可填充,0代表不可填充
printf("please input a integer(3~20):\n");
scanf("%d",&n);
//对数组b进行初始化
for(i = 0;i < N; ++i)
{
for(j = 0;j < N; ++j)
{
if( j < n - i) b[i][j] = 1;
else b[i][j] = 0;
}
}
//填充第一个数
num = 1;
a[0][0] = num;
b[0][0] = 0; //填充完后将b中对应的位置设为0
setnext(num + 1,a,b,0,0,ONE); //用setnext函数填充剩下的数
printf("现在开始填充:\n");
//将填充好的数组a输出
for(i = 0;i < n; ++i)
{
for(j = 0;j < n - i; ++j)
printf("%4d",a[i][j]);
printf("\n");
}
}
void setnext(int m,int arr1[][N],int arr2[][N],int x,int y,int f)
{
//进入函数后要么填充一个数,要么结束递归
while(1)
{
//若路径为ONE
if(ONE == f)
//判断路径ONE的下一个位置是否可以填充
if(y + 1 < N && 1 == arr2[x][y + 1] )
{
y = y + 1;
arr1[x][y] = m;
arr2[x][y] = 0;
break;
}
//若不能填充则转向路径TWO
else f = TWO;
//若路径为TWO
if(TWO == f)
//判断路径TWO的下一个位置是否可以填充
if(x + 1 < N && y - 1 >=0
&& 1 == arr2[x + 1][y - 1])
{
x = x + 1;
y = y - 1;
arr1[x][y] = m;
arr2[x][y] = 0;
break;
}
//若不能填充则转向路径THREE
else f = THREE;
//若路径为THREE
if(THREE == f)
//判断路径THREE的下一个位置是否可以填充
if(1 == arr2[x - 1][y])
{
x = x - 1;
arr1[x][y] = m;
arr2[x][y] = 0;
break;
}
//若不能填充则转向路径ONE
else f = ONE;
//当所有路径都不能填充时,结束递归
if(1 != arr2[x][y + 1]
&& 1 != arr2[x + 1][y - 1]
&& 1 != arr2[x - 1][y])
{
return;
}
}
//递归填充下一位置
setnext(m + 1,arr1,arr2,x,y,f);
}
运行结果:
please input a integer(3~20):
15
现在开始填充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
42 43 44 45 46 47 48 49 50 51 52 53 54 16
41 75 76 77 78 79 80 81 82 83 84 55 17
40 74 99 100 101 102 103 104 105 85 56 18
39 73 98 114 115 116 117 106 86 57 19
38 72 97 113 120 118 107 87 58 20
37 71 96 112 119 108 88 59 21
36 70 95 111 109 89 60 22
35 69 94 110 90 61 23
34 68 93 91 62 24
33 67 92 63 25
32 66 64 26
31 65 27
30 28
29