開啟章節選單
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; }