圖形輸出是 PAT(程序設計能力測試)高頻考點,核心考察循環嵌套控制、坐標映射邏輯、邊界條件處理、輸出格式精確控制。本文精選三大經典題目:B1027 沙漏、A1031 U型輸出、矩陣旋轉/蛇形填充 變體,提供完整 C++ 解法、幾何邏輯圖解與通用模板。
給定 N (≤1000) 個符號,按沙漏形狀打印:每行奇數個符號、居中對齊、相鄰行差2、先遞減到1再遞增、首尾行符號數相等。用盡可能多符號,最後輸出剩餘數。
k = floor(sqrt((N+1)/2)),若 k 為偶數則 -1 保證奇數#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 形盡可能「正方」。
幾何參數推導
#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 行/列 邊界判斷 周界坐標映射 矩陣旋轉 N i,j 新舊坐標 new[i][j]=old[n-1-j][i] 蛇形/之字 行數,列數 行號 列方向翻轉 col = row%2? n-1-c : c 易錯點檢查清單
- 行末無多餘空格:最後一個字符後不輸出空格,
printf格式控制- 換行精確:每行結束
\n,不多不少- 奇偶層數處理:沙漏上下半部邊界(含/不含中間行)
- 字符串索引不越界:pos 計數器嚴格對應 N
- 最小規模測試:N=5, N=6 手動驗證幾何參數
總結
PAT 圖形輸出題本質是離散幾何映射到字符矩陣的邏輯構造能力測試。掌握 參數推導(k, n1, n2, n3)、雙層循環嵌套、條件輸出(空格/字符/換行) 三大核心技能,配合「先推導幾何規律、再寫代碼、最後測邊界」的規範流程,即可從容應對各類變體。建議收藏本文通用模板表,遇到新題快速套用幾何模型。