首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HDU 2091 空心三角形:輸出格式精確控制與邏輯構建

     編輯:關於C++

HDU 2091 要求打印空心等腰三角形:給定字符和高度 n (0 < n < 41),底邊長 2n-1,內部為空格。多組數據之間空一行,遇到 '@' 結束。本文詳細分析行列規律、格式控制陷阱及 AC 代碼。

圖形規律分析

以 n=4, 字符 'X' 為例:

   X      第1行:1個字符,前導空格 n-1
  X X     第2行:2個字符,中間空格 1
 X   X    第3行:2個字符,中間空格 3
XXXXXXX   第4行:2n-1=7個字符,無空格

第 i 行 (1 ≤ i < n)

  • 前導空格:n - i 個
  • 第 1 個字符
  • 若 i > 1:中間空格 2*(i-1) - 1 = 2i-3 個,第 2 個字符
  • 換行

第 n 行(底邊)

  • 連續打印 2*n - 1 個字符
  • 換行

格式控制關鍵點(易錯)

  1. 行末無多餘空格:最後一個字符後直接換行。
  2. 多組數據間空一行:第一組輸出後無空行,第二組輸出前先輸出一個空行(即上一組結束後輸出換行,再輸出一個空行)。
  3. 字符可能為多字節/可見字符:用 %s 讀入字符串,printf("%s", str) 輸出,支援任意可打印字符。

AC 代碼(C)

#include <stdio.h>
#include <string.h>

int main() {
    int n;
    char ch[10];
    int firstCase = 1;
    while (scanf("%s", ch) != EOF) {
        if (ch[0] == '@') break;
        scanf("%d", &n);
        if (!firstCase) printf("\n"); // 第2組起,輸出前先空一行
        firstCase = 0;

        // 第1行到第n-1行
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j <= n - i; ++j) printf(" ");
            printf("%s", ch);
            if (i > 1) {
                for (int k = 1; k <= 2 * i - 3; ++k) printf(" ");
                printf("%s", ch);
            }
            printf("\n");
        }
        // 第n行(底邊)
        for (int i = 1; i <= 2 * n - 1; ++i) printf("%s", ch);
        printf("\n");
    }
    return 0;
}

關鍵變量說明

變量含義
firstCase標記是否為第一組數據,控制組間空行
i當前行號 (1~n)
j前導空格計數器
k中間空格計數器 (2i-3)

調試建議

  • 用 n=1,2,3 手動驗證邊界情況。
  • 檢查輸出是否每行末尾無空格(重定向到文件用 cat -A 查看)。
  • 確認 '@' 只作為終止符,不處理其後的數字。

總結

空心三角形屬於「規律找規律、格式控制」類基礎題。核心難點不在算法,而在於精確處理組間空行、行末無空格、字符串輸出等格式細節。建議比賽前多練習此類輸出格式敏感題,養成「先寫骨架、再填邏輯、最後驗證格式」的習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved