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

PAT圖形輸出專題精解:沙漏/U型/矩陣旋轉等經典模式全覆蓋

     編輯:關於C語言

PAT圖形輸出專題精解:沙漏/U型/矩陣旋轉等經典模式全覆蓋

圖形輸出是 PAT(程序設計能力測試)高頻考點,核心考察循環嵌套控制、坐標映射邏輯、邊界條件處理、輸出格式精確控制。本文精選三大經典題目:B1027 沙漏、A1031 U型輸出、矩陣旋轉/蛇形填充 變體,提供完整 C++ 解法、幾何邏輯圖解與通用模板。

題目一:B1027 打印沙漏(20分)

問題描述

給定 N (≤1000) 個符號,按沙漏形狀打印:每行奇數個符號、居中對齊、相鄰行差2、先遞減到1再遞增、首尾行符號數相等。用盡可能多符號,最後輸出剩餘數。

幾何規律推導

  • 沙漏上半部(含中間):1, 3, 5, ..., (2k-1) → 等差數列求和 = k²
  • 完整沙漏符號數 = 2×k² - 1(中間行不重複)
  • 已知 N,求最大 k:k = floor(sqrt((N+1)/2)),若 k 為偶數則 -1 保證奇數
  • 底行寬度 = 2k-1
  • 已用符號 = 2k² - 1,剩餘 = N - 已用

代碼實現

#include <cstdio> #include <cmath>
int main() {
    int n; char c; scanf("%d %c", &n, &c);
    int k = (int)sqrt(2.0*(n+1)) - 1;
    if (k % 2 == 0) k--;
    int used = (k+1)*(k+1)/2 - 1;  // 等價 2k²-1 推導
    // 上半部(含中間)
    for (int i=k; i>=1; i-=2) {
        for (int s=0; s<(k-i)/2; s++) printf(" ");
        for (int s=0; s

樣例驗證

輸入:19 *
輸出:
*****
 ***
  *
 ***
*****
2

題目二:A1031 Hello World for U(20分)

問題描述

給定長度 N (5~80) 字符串,按 U 形輸出:左竖線 n1 字符(自上而下)、底邊 n2 字符(左向右)、右竖線 n3 字符(自下而上)。要求 n1=n3=max{k | k≤n2, 3≤n2≤N},滿足 n1+n2+n3-2=N。U 形盡可能「正方」。

幾何參數推導

  • 總字符:n1 + n2 + n3 - 2 = N(兩角各算一次)
  • n1 = n3,設 n1 = n3 = k → 2k + n2 - 2 = N → n2 = N + 2 - 2k
  • 條件 k ≤ n2 → k ≤ N + 2 - 2k → 3k ≤ N + 2 → k = floor((N+2)/3)
  • n2 = N + 2 - 2k

代碼實現(二維數組法)

#include <cstdio> #include <cstring>
int main() {
    char str[100], a[40][40]; gets(str);
    int N = strlen(str);
    int n1 = (N+2)/3, n3 = n1, n2 = N+2-n1-n3;
    int pos = 0;
    // 初始化空格
    for (int i=1; i<=n1; i++) for (int j=1; j<=n2; j++) a[i][j] = ' ';
    // 左竖線
    for (int i=1; i<=n1; i++) a[i][1] = str[pos++];
    // 底邊
    for (int j=2; j<=n2; j++) a[n1][j] = str[pos++];
    // 右竖線(自下而上)
    for (int i=n3-1; i>=1; i--) a[i][n2] = str[pos++];
    // 輸出
    for (int i=1; i<=n1; i++) {
        for (int j=1; j<=n2; j++) printf("%c", a[i][j]);
        printf("\n");
    }
    return 0;
}

優化版(無二維數組,直接計算輸出)

for (int i=0; i

樣例驗證

輸入:helloworld!
輸出:
h !
e d
l l
lowor

題目三變體:矩陣順時針旋轉90度 / 蛇形填充

核心坐標映射

  • 順時針90度:new[i][j] = old[n-1-j][i] (N×N方陣)
  • 逆時針90度:new[i][j] = old[j][n-1-i]
  • 蛇形填充:偶數行左→右,奇數行右→左,列索引 j = (row%2==0) ? col : n-1-col

圖形輸出通用模板總結

模式核心參數外層循環內層邏輯關鍵公式
沙漏/金字塔層數k, 底寬行號 i空格+符號空格=(底寬-當前寬)/2
U型/框架n1,n2,n3行/列邊界判斷周界坐標映射
矩陣旋轉Ni,j新舊坐標new[i][j]=old[n-1-j][i]
蛇形/之字行數,列數行號列方向翻轉col = row%2? n-1-c : c

易錯點檢查清單

  1. 行末無多餘空格:最後一個字符後不輸出空格,printf 格式控制
  2. 換行精確:每行結束 \n,不多不少
  3. 奇偶層數處理:沙漏上下半部邊界(含/不含中間行)
  4. 字符串索引不越界:pos 計數器嚴格對應 N
  5. 最小規模測試:N=5, N=6 手動驗證幾何參數

總結

PAT 圖形輸出題本質是離散幾何映射到字符矩陣的邏輯構造能力測試。掌握 參數推導(k, n1, n2, n3)、雙層循環嵌套、條件輸出(空格/字符/換行) 三大核心技能,配合「先推導幾何規律、再寫代碼、最後測邊界」的規範流程,即可從容應對各類變體。建議收藏本文通用模板表,遇到新題快速套用幾何模型。

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