題目描述
小楊想要構造一個 ?X 字矩陣( 為奇數),這個矩陣的兩條對角線都是半角加號 + ,其余都是半角減號 - 。例如,一個 5×5 的 X 字矩陣如下:
+---+
-+-+-
--+--
-+-+-
+---+
請你幫小楊根據給定的 打印出對應的“X 字矩陣”。
輸入格式
一行一個整數 ( 5≤N≤49,保證為奇數)。
輸出格式
輸出對應的“X 字矩陣”。
請嚴格按格式要求輸出,不要擅自添加任何空格、標點、空行等任何符號。你應該恰好輸出 N 行,每行除了換行符外恰好包含 N 個字符,這些字符要么是 +,要么是 -。
輸入輸出樣例
說明/提示
特別提醒
在常規程序中,輸入、輸出時提供提示是好習慣。但在本場考試中,由于系統限定,請不要在輸入、輸出中附帶任何提示信息。
題目鏈接地址:B3865 [GESP202309 二級] 小楊的 X 字矩陣 - 洛谷
解題思路
對于這類矩陣圖形的輸出,要求一定要熟練掌握,并能舉一反三解決類似問題(如Z字形、日字形、H形等)。
1. 觀察規律(從具體到抽象)
目標:發現X形矩陣中+和-的位置規律。
方法:用可視化例子引導思考:
# 5×5 的X形矩陣(行號i從1開始,列號j從1開始)
+---+ ?# 第1行:i=1,主對角線(i=j=1) 或 副對角線(i+j=1+5=6)
-+-+- ?# 第2行:i=2,滿足i=j=2?或 i+j=2+4=6
--+-- ?# 第3行:i=3,兩對角線交叉,可以表示為i=j=3,或者i+j=6
-+-+- ?# 第4行:i=4,主對角線i=j=4,或副對角線i+j=4+2=6
+---+ ?# 第5行:i=5,主對角線i=j=5,或副對角線i+j=5+1
思考:
- 主對角線上的+滿足什么條件?(行號i等于列號j)
- 副對角線上的+滿足什么條件?(行號i加列號j等于N+1)
- 其他位置是什么符號?(-)
2. 數學建模(規律轉公式)
目標:將觀察到的規律轉化為數學條件。
核心結論:
- 輸出“+“”的條件:i == j 或 i + j == N +1
- 否則輸出‘’-‘’
驗證:對于5×5矩陣的中心點(3,3):同時滿足i==j和i+j==6,仍正確
3、代碼實現(分步拆解)
目標:將數學條件轉化為代碼,強調循環嵌套和條件判斷。
關鍵點:
(1)輸入矩陣大小 n
? ? ? ? ?題目保證 N?是 5~49 的奇數,所以不需要額外檢查。
(2)雙重循環遍歷矩陣
? ? ? ? ?外層循環 for (int i = 1; i < =N; i++):控制行號 i,從 1到 N。
? ? ? ? ?內層循環 for (int j = 1?j < =N; j++):控制列號 j,從 1到 N。
(3)條件判斷(判斷是否在對角線上)
? ? ? ? ?主對角線:行號 i 等于列號 j(即 i == j)。
? ? ? ? ?副對角線:行號 i 加列號 j 等于 N+1(即 i + j == N+1)。
? ? ? ? ?如果滿足任意一個條件,輸出 '+',否則輸出 '-'。
(4)輸出控制(換行處理)
? ? ? ? ?每行結束后使用 cout << endl; 換行。
代碼
#include <iostream>
using namespace std;
int main(){int N;cin>>N;for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){if(i==j||i+j==N+1)cout<<'+';else cout<<'-';}cout<<endl;}return 0;
}
舉一反三(擴展思維)
變形問題:思考其他類似圖形如何實現
1. Z字形矩陣:
第一行和最后一行全 +,中間行僅副對角線 +。
if (i == 0 || i == N?|| i + j == N+1) {
? ? cout << '+';
} else {
? ? cout << '-';
}
2.?空心矩形:
僅最外層 +,內部 -。
if (i == 0 || i == N?|| j == 0 || j == N) {
? ? cout << '+';
} else {
? ? cout << '-';
}
3. N字矩陣
第一列和最后一列全 +,中間列僅對角線 +。
if(j == 1 || j == N?|| j == i){
?? ??? ??? ??? ?cout << "+";
?? ??? ??? ?}else{
?? ??? ??? ??? ?cout << "-";
常見錯誤
- 邊界錯誤:可能混淆n和n-1(從0開始還是1開始)
- 條件遺漏:忘記用or合并兩條對角線。
- 輸出格式:忘記換行。