範例輸入1:
2範例輸出1:
範例輸入2:
3範例輸出2:
範例輸入3:
4範例輸出3:
Solution 1 [簡易] (設兩個變數分別儲存o和x每行要輸出的數量):
/* Programming By Linwebs */
#include<iostream> // 引入 C++ 標頭檔
using namespace std; // 使用 std 名稱空間
int main() { // C++ 主程式
int n, o, x;
// n 儲存三角形的大小
// o 儲存當前每一行左側和右側的 'o' 要顯示的數量
// x 儲存當前每一行中間的 'x' 要顯示的數量
cin >> n; // 首先輸入 n 設定三角形的大小
// 先設定第一行 'o' 和 'x' 的數量
o = n; // 第一行 'o' 左側和右側的數量跟 n 一樣
x = 1; // 第一行 'x' 的數量為 1 個
for(int i=0; i<=n; i++) {
// 要輸出 n+1 行,所以要執行 n+1 次
for(int j=0; j<o; j++) {
// 輸出左側 o 個 'o'
cout << "o";
}
for(int j=0; j<x; j++) {
// 輸出中間 x 個 'x'
cout << "x";
}
for(int j=0; j<o; j++) {
// 輸出右側 o 個 'o'
cout << "o";
}
// 每輸出完一行後,就將 o 和 x 數量調整為下一行的數量
// o 的數量每輸出完一行,左側和右側各會減少 1 個,故將 o 的數量設為 o 當前的數量再減 1
o--;
// x 的數量每輸出完一行,會增加兩個,故將 x 的數量設為 x 當前的數量再加 2
x += 2;
// 每輸出完一行就須換行
cout << endl;
}
return 0; // 程式執行完畢,回傳 0
}
Solution 2純解法 [進階] (只用 n 判斷要輸出o或x):
/* Programming By Linwebs */
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=0; i<=n; i++) {
for(int j=0; j<(n*2+1); j++) {
if(j < (n-i) || j > (n-i+i*2))
cout << "o";
else
cout << "x";
}
cout << endl;
}
return 0;
}
Solution 2加入註解 [進階] (只用 n 判斷要輸出o或x):
/* Programming By Linwebs */
#include<iostream> // 引入 C++ 標頭檔
using namespace std; // 使用 std 名稱空間
int main() { // C++ 主程式
int n; // n 儲存三角形的大小
cin >> n; // 首先輸入 n 設定三角形的大小
for(int i=0; i<=n; i++) { // 要顯示 n+1 行,所以要執行 n+1 次
for(int j=0; j<(n*2+1); j++) { // 每行要顯示 2 倍的 n 加 1 個字元
/* 左側要輸出 'o' 的數量為 n-i-1 個,也就是三角形的大小減去當前行數,故要輸出的情況為 j < (n-i) 時
* 中間 'x'的數量為 (i*2+1) 個,故要輸出的情況為左側數量 j >= (n-i) 且 j <= ( (n-i) + (i*2) ) 時
* 右側的數量與左側相同,判斷方式為輸出完左側與中間後才執行,故要輸出右側 'o' 的情況為 j > ( (n-i) + (i*2) ) 時
*/
if(j < (n-i) || j > (n-i+i*2)) // 判斷當下要輸出的字元 j 是位於左側中間或右側
cout << "o"; // 當輸出的字元為左側或右側時,輸出 'o'
else
cout << "x"; // 否則就輸出 'x'
}
cout << endl; // 每輸出完一行就須換行
}
return 0; // 程式執行完畢,回傳 0
}
題目來源:國立嘉義大學資訊工程學系廖祐德