Triangle Wave

解題想法

本題是經典的 「n 次詢問」問題,我們將一步引導如何解決此題。

1. 詢問並重複

在題目敘述中提到,我們要先輸入詢問次數 n ,之後再重複詢問 n 次,因此我們可以將迴圈寫成以下範例:

cin >> n;
for (int i = 0; i < n; i++) {
    cin >> a >> f;
    //...
}

2. 生成波形圖

在本章節中有提到,for 迴圈可以重疊成一個雙迴圈,因此我們可以利用這個技巧來輸出波形圖

首先,我們可以依題意來建立一個迴圈,代表頻率 f

for (int j = 0; j < f; j++) {
    //...
}

接下來,我們可以添加兩個雙層迴圈,分別生成波形圖的下半部上半部

for (int j = 0; j < f; j++) {
    for (int k = 1; k <= a; k++) {
        for (int p = 1; p <= k; p++) cout << p;
        cout << '\n';
    }
    for (int k = a - 1; k >= 1; k--) {
        for (int p = 1; p <= k; p++) cout << p;
        cout << '\n';
    }
}
注意

上部分和下部分除了上下顛倒外,還有兩者的最長邊是重疊的,也就是只有一行。

3. 分隔波形圖

在題目敘述中,各波形圖之間要有一間隔,所以我們在生成圖形時,可以多設定一個變數 tmp ,用來判斷是否能輸出間隔。

int tmp = 0;

//...

for (int j = 0; j < f; j++) {
    if (tmp) cout << '\n';
    for (int k = 1; k <= a; k++) {
        for (int p = 1; p <= k; p++) cout << p;
        cout << '\n';
    }
    for (int k = a - 1; k >= 1; k--) {
        for (int p = 1; p <= k; p++) cout << p;
        cout << '\n';
    }
    tmp++;
}

範例程式

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, a, f, tmp = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a >> f;
        for (int j = 0; j < f; j++) {
            if (tmp) cout << '\n'; //檢測是否能間隔
            //輸出波形圖
            for (int k = 1; k <= a; k++) {
                for (int p = 1; p <= k; p++) cout << k;
                cout << '\n';
            }
            for (int k = a - 1; k >= 1; k--) {
                for (int p = 1; p <= k; p++) cout << k;
                cout << '\n';
            }
            //
            tmp++; 
        }
    }
    return 0;
}