c++超详细教程(十分系统) 2024-08-25 09:16 采纳率: 80%
浏览 13
已结题

怎么做?我真的不知道。我好抓狂啊!

给你两个整数 n,m
,请你构造一个 n
行 m
列的蛇形方阵,在这个方阵中,数字由 1
到 n×m
,从最右上角开始,呈环状(逆时针)向内填充,例如 n=3,m=3
的时候,蛇形方阵如下:

3 2 1
4 9 8
5 6 7
输入格式
第一行包含两个整数 n,m

输出格式
一共 n
行,每行 m
个整数,表示对应的蛇形方阵,同一行的相邻两个数之间用一个空格分隔。

样例输入
4 6
样例输出
6 5 4 3 2 1
7 20 19 18 17 16
8 21 22 23 24 15
9 10 11 12 13 14
数据规模
对于 100%
的数据,保证 1≤n,m≤100

有人会做吗?
(思路及代码)

  • 写回答

3条回答 默认 最新

  • 铭渊老黄 新星创作者: Python技术领域 2024-08-25 18:33
    关注
    🕒下午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“成功是一个旅程,而不是一个目的地。” — 亚瑟·阿什
    

    构造一个蛇形方阵的思路是通过模拟填充的过程。我们可以从右上角开始,按照逆时针的方向填充数字,直到填满整个矩阵。以下是实现这个过程的步骤和代码示例。

    思路

    1. 初始化矩阵:创建一个 n x m 的二维数组,并初始化为0。
    2. 定义方向:使用一个方向数组来表示逆时针的四个方向:左、下、右、上。
    3. 填充数字:从1开始,依次填充到 n * m,每次根据当前方向填充数字,并在填充后检查是否需要改变方向(即是否到达边界或已经填充过的单元格)。
    4. 输出结果:最后输出填充好的矩阵。

    代码实现

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

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, m;
        cin >> n >> m;
    
        // 初始化 n x m 的矩阵
        vector<vector<int>> matrix(n, vector<int>(m, 0));
    
        // 定义方向:左、下、右、上
        int directions[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
        int dir = 0; // 从左开始
        int x = 0, y = m - 1; // 从右上角开始
    
        for (int num = 1; num <= n * m; num++) {
            matrix[x][y] = num; // 填充数字
    
            // 计算下一个位置
            int next_x = x + directions[dir][0];
            int next_y = y + directions[dir][1];
    
            // 检查下一个位置是否在边界内且未填充
            if (next_x < 0 || next_x >= n || next_y < 0 || next_y >= m || matrix[next_x][next_y] != 0) {
                dir = (dir + 1) % 4; // 改变方向
                next_x = x + directions[dir][0];
                next_y = y + directions[dir][1];
            }
    
            // 更新当前坐标
            x = next_x;
            y = next_y;
        }
    
        // 输出结果
        for (const auto& row : matrix) {
            for (int j = 0; j < m; j++) {
                cout << row[j] << (j == m - 1 ? "" : " ");
            }
            cout << endl;
        }
    
        return 0;
    }
    

    代码解释

    1. 输入:读取 nm
    2. 矩阵初始化:使用 vector 创建一个 n x m 的矩阵,并初始化为0。
    3. 方向数组:定义四个方向的变化,分别对应左、下、右、上。
    4. 填充循环:使用一个循环从1填充到 n * m,在每次填充后检查是否需要改变方向。
    5. 输出:最后遍历矩阵并输出结果。

    示例

    对于输入 4 6,输出将会是:

    6 5 4 3 2 1
    7 20 19 18 17 16
    8 21 22 23 24 15
    9 10 11 12 13 14
    

    这个代码实现了你所需要的蛇形方阵的构造,按照逆时针的方式填充数字。希望这能帮助你解决问题!如果有任何疑问,请随时问我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月28日
  • 创建了问题 8月25日