方陣的主對角線之上稱爲“上三角”。
請你設計一個用於填充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,右對齊。
分析:
思路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;
}