巢狀迴圈-三角形繪製2

巢狀迴圈-三角形繪製2

YuDong Lv2

題目:

出處:SA 流 C++ 競程修練心法

思考方法:

我先以 輸出3個# 為例子,下去推想。

輸出 1 個 #
輸出 2 個 #
輸出 3 個 #
輸出 2 個 #
輸出 1 個 #

分成 兩層來輸出 的話 則:

第一層

輸出 1 個 #
輸出 2 個 #
輸出 3 個 #

第二層

輸出 2 個 #
輸出 1 個 #

再來假設環節,

要做n次,所以 第一層的迴圈 即為 遞增

1
2
3
for (i=1;i<=n;i++>) {
//進來迴圈 → 輸出i個 # → 輸出換行
}

再來,是 # 的部分
所以:

1
2
3
for(j=0;j<i;j++>) {
cout << "#";
}

合體,第一層就完成了!

1
2
3
4
5
6
for (i=1;i<=n;i++>) {
for (j=0;j<i;j++>) {
cout << "#";
}
cout << "\n" ;
}

而當我們達到 輸出 n 次 的 # 時
我們要倒回去 , 即為 遞減

1
2
3
4
for (i=n;i>0;i--) {
// 進入迴圈 → 輸出(n-1)個 → 輸出換行
cout << "\n";
}

接著處理 輸出 (n-1) 個 #

1
2
3
for (j=0;j<i;j++>) {
cout << "#";
}

合體!

1
2
3
4
5
6
7
for (i=n;i>0;i--) {
for (j=0;j<i;j++>) {
cout << "#";
}
cout << "\n";
}

將第一層與第二層合併

CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int main() {
int n;
int i, j;
cin >> n;
for (i = 1; i <= n; i++) {
for (j = 0; j < ij; j++) {
cout << "#";
}
cout << "\n";
}
for (i = n; i > 0; i--) {
for (j = 0; j < i; j++) {
cout << "#";
}
cout << "\n";
}
return 0;
}

解題心得

  • 我剛開始解這題,一直把它侷限在用一個大迴圈包數個小迴圈的巢狀結構去解。沒想到換個思路後,解起來比較輕鬆。
    不要太過於執著一把幹到底
  • 對於巢狀迴圈有更多的了解了!
  • 我解題會把迴圈拆的一個步驟一個迴圈去想,一次處裡多個迴圈我腦子會炸!
留言