求助:如何用C++实现指定尺寸的*与#图案填充正方形?
解决C++图案输出问题
嘿,我来帮你搞定这个编程作业!先仔细看看你给的例子,我们能提炼出一个通用的规则,然后照着规则写代码就行。
先拆解图案规律
观察你给出的两个例子:
- 输入6 6时,输出的图案里,最外层的所有字符都是
#;然后往里一层(第二行、倒数第二行,以及每行的第二列、倒数第二列)全是*;再往里的区域就又变回#了。 - 输入4 3时,最外层是
#,中间唯一一行的内层全是*。
总结成每个单元格的通用规则:
对于矩阵中第i行(从0开始计数)、第j列(从0开始计数)的位置:
- 计算这个位置到最近的边缘的最小距离
d:int d = min(min(i, height - 1 - i), min(j, width - 1 - j)); - 根据
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; }
代码解释
- 输入部分:先读取用户输入的宽和长,注意这里的“宽”是列数,“长”是行数。
- 双重循环:外层循环遍历每一行,内层循环遍历当前行的每一列。
- 距离计算:用
min函数嵌套计算当前位置到上下左右四个边缘的最小距离d。 - 字符输出:根据
d的值输出对应的#或*,每行结束后换行。
你可以测试一下输入6 6和4 3,输出完全符合你给的例子!如果还有其他疑问,随时问~
内容的提问来源于stack exchange,提问作者Death3003
相关产品推荐
相关产品推荐

