You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用C++实现指定尺寸的*与#图案填充正方形?

解决C++图案输出问题

嘿,我来帮你搞定这个编程作业!先仔细看看你给的例子,我们能提炼出一个通用的规则,然后照着规则写代码就行。

先拆解图案规律

观察你给出的两个例子:

  • 输入6 6时,输出的图案里,最外层的所有字符都是#;然后往里一层(第二行、倒数第二行,以及每行的第二列、倒数第二列)全是*;再往里的区域就又变回#了。
  • 输入4 3时,最外层是#,中间唯一一行的内层全是*。

总结成每个单元格的通用规则:
对于矩阵中第i行(从0开始计数)、第j列(从0开始计数)的位置:

  1. 计算这个位置到最近的边缘的最小距离d:
    int d = min(min(i, height - 1 - i), min(j, width - 1 - j));
    
  2. 根据d的值决定输出的字符:
    • 如果d == 0:这个位置在最外层,输出#
    • 如果d == 1:这个位置在往里一层,输出*
    • 如果d >= 2:更内层的位置,输出#

这个规则完美匹配你给的两个例子,而且能适配任意的宽和长组合哦!

完整的C++代码实现

#include <iostream>
#include <algorithm> // 用于min函数

using namespace std;

int main() {
    int width, height;
    cout << "请输入宽和长:";
    cin >> width >> height;

    // 遍历每一行
    for (int i = 0; i < height; ++i) {
        // 遍历每一列
        for (int j = 0; j < width; ++j) {
            // 计算到最近边缘的最小距离
            int d = min(min(i, height - 1 - i), min(j, width - 1 - j));
            if (d == 0) {
                cout << '#';
            } else if (d == 1) {
                cout << '*';
            } else {
                cout << '#';
            }
        }
        cout << endl; // 每行结束换行
    }

    return 0;
}

代码解释

  1. 输入部分:先读取用户输入的宽和长,注意这里的“宽”是列数,“长”是行数。
  2. 双重循环:外层循环遍历每一行,内层循环遍历当前行的每一列。
  3. 距离计算:用min函数嵌套计算当前位置到上下左右四个边缘的最小距离d。
  4. 字符输出:根据d的值输出对应的#或*,每行结束后换行。

你可以测试一下输入6 6和4 3,输出完全符合你给的例子!如果还有其他疑问,随时问~

内容的提问来源于stack exchange,提问作者Death3003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:18