鱼C论坛

 找回密码
 立即注册
查看: 1169|回复: 2

写一下蛇形矩阵的代码注释,有点儿看不懂

[复制链接]
发表于 2023-10-16 08:45:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 100 + 10;
int m[N][N];

int main(){
    int n;
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

    while(cin >> n, n ){
        memset(m, 0, sizeof m);
        int d = 1, x = 0, y = 0;
        int cnt = 0;  // 表示改变方向次数
        int res = 1;  // 回形当前圈数
        for (int i = 0; i < n * n; i ++){
            int a = x + dx[d], b = y + dy[d];
            m[x][y] = res;

            if (a < 0 || a >= n || b < 0 || b >= n || m[a][b]){
                d = (d + 1) % 4;
                a = x + dx[d], b = y + dy[d];
                cnt ++;
                if (!(cnt % 4)) res ++;
            }
            x = a, y = b;
        }

        for (int i = 0; i < n; i ++){
            for (int j = 0; j < n; j ++)
                cout << m[i][j] << ' ';
            cout << endl;
        }
        cout << endl;
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-16 08:46:10 | 显示全部楼层
这段代码实现了蛇形矩阵的生成,下面是详细的注释:
#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 100 + 10;  // 定义矩阵大小

int m[N][N];  // 定义矩阵

int main(){
    int n;  // 输入矩阵大小
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};  // 定义四个方向的移动
    while(cin >> n, n ){  // 循环输入,直到 n 为 0
        memset(m, 0, sizeof m);  // 初始化矩阵
        int d = 1, x = 0, y = 0;  // 初始方向为右,初始位置为左上角
        int cnt = 0;  // 表示改变方向次数
        int res = 1;  // 回形当前圈数
        for (int i = 0; i < n * n; i ++){  // 生成矩阵
            int a = x + dx[d], b = y + dy[d];  // 移动到下一个位置
            m[x][y] = res;  // 在当前位置填入当前圈数
            if (a < 0 || a >= n || b < 0 || b >= n || m[a][b]){  // 判断是否需要改变方向
                d = (d + 1) % 4;  // 改变方向
                a = x + dx[d], b = y + dy[d];  // 移动到下一个位置
                cnt ++;  // 记录改变方向次数
                if (!(cnt % 4)) res ++;  // 如果改变方向次数是 4 的倍数,说明已经绕了一圈,圈数加 1
            }
            x = a, y = b;  // 更新位置
        }
        for (int i = 0; i < n; i ++){  // 输出矩阵
            for (int j = 0; j < n; j ++)
                cout << m[ i][j] << ' ';
            cout << endl;
        }
        cout << endl;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-16 08:46:23 | 显示全部楼层
这段代码是用来生成蛇形矩阵的。蛇形矩阵是一种特殊的矩阵,它的元素从中心开始,按照螺旋的方式向外扩展。下面是对这段代码的注释:
#include <iostream> // 引入输入输出流库
#include <cstring>  // 引入字符串处理库
#include <cmath>    // 引入数学函数库
using namespace std; // 使用标准命名空间

const int N = 100 + 10; // 定义常量N,用于设置矩阵的最大尺寸
int m[N][N]; // 定义二维数组m,用于存储蛇形矩阵

int main(){ // 主函数
    int n; // 定义变量n,用于存储矩阵的尺寸
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}; // 定义两个数组dx和dy,用于控制矩阵元素填充的方向

    while(cin >> n, n ){ // 从输入流中读取矩阵的尺寸n,当n不为0时,执行循环体
        memset(m, 0, sizeof m); // 使用memset函数将矩阵m的所有元素初始化为0
        int d = 1, x = 0, y = 0; // 定义变量d、x和y,d用于控制方向,x和y用于控制当前填充的位置
        int cnt = 0; // 定义变量cnt,用于记录改变方向的次数
        int res = 1; // 定义变量res,用于记录当前填充的圈数

        for (int i = 0; i < n * n; i ++){ // 循环n*n次,填充矩阵的所有元素
            int a = x + dx[d], b = y + dy[d]; // 计算下一个填充位置的坐标
            m[x][y] = res; // 将当前位置的元素设置为res

            if (a < 0 || a >= n || b < 0 || b >= n || m[a][b]){ // 如果下一个位置超出矩阵的范围,或者下一个位置已经被填充,则改变方向
                d = (d + 1) % 4; // 改变方向
                a = x + dx[d], b = y + dy[d]; // 重新计算下一个填充位置的坐标
                cnt ++; // 改变方向的次数加1
                if (!(cnt % 4)) res ++; // 如果改变方向的次数是4的倍数,则圈数加1
            }
            x = a, y = b; // 更新当前填充的位置
        }

        for (int i = 0; i < n; i ++){ // 循环n次,输出矩阵的每一行
            for (int j = 0; j < n; j ++) // 循环n次,输出矩阵的每一列
                cout << m[ i][j] << ' '; // 输出矩阵的元素,并在元素之间添加一个空格
            cout << endl; // 在每一行的末尾添加一个换行符
        }
        cout << endl; // 在输出完一个矩阵后,添加一个换行符
    }

    return 0; // 主函数返回0,表示程序正常结束
}

这段代码的主要思路是,从矩阵的左上角开始,按照右、下、左、上的顺序填充矩阵的元素,每填充一圈,元素的值就增加1。当填充到矩阵的边界,或者下一个位置已经被填充时,就改变填充的方向。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 21:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表