螺旋三角形

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

請你設計一個用於填充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、最後由下往上打印

4、重複1-3

5、所有的路線走法以遇到非0停止

實現方法步驟:我們以 n = 10爲例

         1、定義一個二維數字,並設置一個非零邊界

#define MAXLEN 22
#define NOZERO 1
int arr[22][22] = { 0 };
int num = 1;
int value;
scanf_s("%d", &value, sizeof(value));
for (i = 0; i < MAXLEN; i++) {
    arr[i][0] = NOZERO;
    arr[0][i] = NOZERO;
}
arr[num][value + 1] = NOZERO;

執行後的效果圖如下

 

2、第一次由左向右打印首行

int i = 1;
int j = 0;
while (!arr[i][j + 1]) {
    arr[i][++j] = num++;
}

執行後的效果圖如下

3、第一次由右上向左下斜對角線打印

while (!arr[i + 1][j - 1]) {
    arr[++i][--j] = num++;
}

執行後的效果圖如下

4、第一次由下向上打印

while (!arr[i-1][j]) {
    arr[--i][j] = num++;
}

執行後的效果圖如下

5、加個循環操作,設置判斷退出條件最多填充數 num <= (n * n – n) / 2 + n

for (i = 1, j = 0; num <= (value * value - value) / 2 + value;) {
    while (!arr[i][j + 1]) {
        arr[i][++j] = num++;
    }

    while (!arr[i + 1][j - 1]) {
        arr[++i][--j] = num++;
    }

    while (!arr[i - 1][j]) {
        arr[--i][j] = num++;
    }
}

執行後的效果圖如下

6、參考代碼

#include<stdio.h>
#include<string.h>

#define MAXLEN 22
#define NOZERO 1

int main()
{
    int arr[22][22] = { 0 };
    int num = 1;
    int i;
    int j;
    int value;
    while (~scanf_s("%d", &value, sizeof(value))) {
        for (i = 0; i < MAXLEN; i++) {
            arr[i][0] = NOZERO;
            arr[0][i] = NOZERO;
        }
        arr[num][value + 1] = NOZERO;

        for (i = 1, j = 0; num <= (value * value - value) / 2 + value;) {
            while (!arr[i][j + 1]) {
                arr[i][++j] = num++;
            }

            while (!arr[i + 1][j - 1]) {
                arr[++i][--j] = num++;
            }

            while (!arr[i - 1][j]) {
                arr[--i][j] = num++;
            }
        }
        for (i = 1; i <= value; i++) {
            for (j = 1; j <= value + 1 - i; j++)
                printf("%4d", arr[i][j]);
            printf("\n");
        }
        memset(arr, 0, sizeof(arr));
        num = 1;
    }

    return 0;
}

 

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