解題想法#
本題是經典的 「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;
}
