1256: 【基础】回形方阵

题目描述

输入n打印回形方阵。

输入

一个整数n (0 < n < 10)

输出

一个方阵,每个数字的场宽为2

样例输入
8
样例输出
 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8
 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8
 8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8
 8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8
 8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8
 8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8
 8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8
 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8
 8 7 6 5 4 3 2 1 1 1 2 3 4 5 6 7 8
 8 7 6 5 4 3 2 2 2 2 2 3 4 5 6 7 8
 8 7 6 5 4 3 3 3 3 3 3 3 4 5 6 7 8
 8 7 6 5 4 4 4 4 4 4 4 4 4 5 6 7 8
 8 7 6 5 5 5 5 5 5 5 5 5 5 5 6 7 8
 8 7 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8
 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8
 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

问题重述

我们需要编写一个程序,输入一个整数n(0 < n < 10),输出一个回形方阵。回形方阵的特点是:

  1. 方阵的尺寸为(2n + 1) × (2n + 1)。

  2. 方阵中的数字从外向内递减,最外层为n,向内依次为n-1, n-2, ..., 0。

  3. 每个数字的场宽为2,即输出时每个数字占两个字符的位置,不足的用空格补齐。

示例分析

以样例输入n=8为例,输出的方阵尺寸为17×17(因为2×8 + 1 = 17)。方阵的最外层是8,向内一层是7,依此类推,直到中心为0。

解题思路

要生成这样的回形方阵,可以按照以下步骤进行:

  1. 确定方阵的尺寸:尺寸为(2n + 1) × (2n + 1)。

  2. 确定每一层的数字:从外向内,数字依次为n, n-1, ..., 0。

  3. 填充方阵

    • 对于方阵中的每一个位置(i, j),其值为max(|i - n|, |j - n|),其中n是输入的数字。

    • 这里的|i - n|和|j - n|表示当前位置到中心的行距离和列距离的最大值。

    • 然后,用n减去这个最大值得到当前位置的数字。

  4. 格式化输出:每个数字占两个字符的宽度,右对齐,不足的用空格补齐。

具体步骤

  1. 输入n:读取用户输入的整数n。

  2. 计算方阵尺寸:size = 2n + 1。

  3. 生成方阵

    • 遍历每一行i(从0到size - 1)。

    • 遍历每一列j(从0到size - 1)。

    • 计算当前位置的数字:value = n - max(|i - n|, |j - n|)。

  4. 输出方阵

    • 对于每个数字,使用printf("%2d", value)或类似方法确保场宽为2。

代码实现

以下是C++的实现代码:
 

#include <iostream>
#include <algorithm>
#include <iomanip>

using namespace std;

int main() {
    int n;
    cin >> n;
    int size = 2 * n + 1;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            int min_dist = min({i, j, size - 1 - i, size - 1 - j});
            int value = n - min_dist;
            cout << setw(2) << value;
        }
        cout << endl;
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值