填充一个上三角矩阵

 

方阵的主对角线之上称为“上三角”。

请你设计一个用于填充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


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值