藍橋杯 程序設計_5

        方陣的主對角線之上稱爲“上三角”。

        請你設計一個用於填充n階方陣的上三角區域的程序。填充的規則是:使用123….的自然數列,從左上角開始,按照順時針方向螺旋填充。

例如:當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

程序運行時,要求用戶輸入整數n3~20

程序輸出:方陣的上三角部分。

要求格式:每個數據寬度爲4,右對齊。

分析:

        思路1:先將輸出存入二維數組,一個變量控制數據寫入數組的方向,計算完所有輸出後一起輸出。[實現簡單,但浪費空間嚴重]

        思路2:順序輸出每個數字,計算並控制數字的顯示位置,使數字直接輸出到正確有位置。[時間換空間]

        思路3:逐行從左到右計算並輸出每個數字。[時間換空間]

解:

採用思路3的程序:

#include <stdio.h>

#define min(a, b)  (((a) < (b)) ? (a) : (b))

typedef int		INT32;
typedef char	INT8;
typedef void	VOID;

//逐行計算並輸出每個值
VOID f(INT32 n)
{
	INT32 row, vol;			//總行,列計數
	INT32 curRow, curVol;	//當前位置行列值
	INT32 cir;				//圈數,每個直角三角形爲1圈
	INT32 x,y;				//每圈數字左上角的座標
	INT32 startNum;			//當前圈起始值
	INT32 curN;				//當前圈總行(列)數
	INT32 num;				//當前值
	INT32 i;
	
	row = n;
	vol = n;	

	for(curRow=1; curRow<=row; curRow++)
	{
		for(curVol=1; curVol<=vol; curVol++)
		{
			cir = min(min(curRow,curVol), min(curVol, vol-curVol+1));	//計算當前位置爲第幾圈

			//計算當前圈左上角數字
			startNum = 1;
			for(i=1; i<cir; i++)
				startNum += 3*(n-1-3*(i-1));

			curN = n-3*(cir-1);	//當前圈總行/列數
			x = y = cir;		//當前圈左上角座標(1起始)

			//計算當前值
			if(curRow == x )
				num = startNum + curVol - x;	//處於直角三角形上直角邊
			else if(curVol == y)
				num = startNum + 3*(n-1-3*(i-1)) - (curRow-y); //處於直角三角形左直角邊
			else
				num = startNum + curN - 1 + curRow - cir; //處於直角三角形斜邊

			printf("%4d", num);
		}

		printf("\n");

		vol--;
	}
}

INT32 main(INT32 argc, INT32 *argv[])
{
	INT32 n;

	printf("請輸入整數>3...\n");

	scanf("%d", &n);

	f(n);

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章