鱼C论坛

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

[已解决]牛客蛇形矩阵

[复制链接]
发表于 2023-10-9 17:13:51 | 显示全部楼层 |阅读模式

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

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

x
#include <bits/stdc++.h>
using namespace std;
int a[1001][1001];
int main()
{
    int n,k=1,looper,x=0,y=0,num=1,tol=0;;
    cin>>n;
    looper =n*n;
    a[0][0]=1;
    while(num<looper) 
    {
        num++;     //a[0][1]
        y++;
        tol++;
        a[x][y]=num;
        for(int i=0;i<tol;i++)
        {
            num++;
            x++;
            y--;
            a[x][y]=num;  //a[1][0]
        }
        num++;
        x++;              //a[2][0]
        tol++;    
        a[x][y]=num;
        for(int i=0;i<tol;i++)
        {
            num++;
            x--;
            y++;
            a[x][y]=num;
        }
        
        
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;

    }
    
    
    
}
应该怎么修改呢,求助
最佳答案
2023-10-9 17:15:36
这段代码是蛇形矩阵中右上方向的赋值操作,它会导致数组越界,因为在 y 减小到 0 后,再次执行 a[x][y]=num; 的时候,y 会变成 -1,此时就会访问数组 a 的一个不存在的位置。

要修复这个问题,可以在每次将 y 减一之前先判断一下是否越界:
++for (int i = 0; i < tol; i++) {    num++;    x++;    y--;    if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0        x++;        y = 0;    }    a[x][y] = num;}
这里加了一个判断语句来检查 y 的值是否小于 0,如果是的话就将 y 设为 0,然后向下移动一格。这样就可以避免数组越界的问题了。

除此之外,还有一些需要注意的地方,比如 tol 变量的含义不太明确,可能应该改为 n(表示矩阵的大小),num 计数器也没有初始化,可以在循环外面赋值为 0。

完整的代码如下:
++#include <iostream>using namespace std;const int MAXN = 1005;int a[MAXN][MAXN];int main() {    int n, num = 0;    cin >> n;    int x = 0, y = n - 1;    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            a[i][j] = 0;        }    }    for (int i = 0; i < n; i++) {        num++;        x++;        a[x][y] = num;        for (int j = 1; j < n; j++) {            num++;            x--;            y++;            if (x < 0) {                x = 0;            }            if (y >= n) {                y = n - 1;            }            a[x][y] = num;        }        if (i != n - 1) {            num++;            y--;            a[x][y] = num;        }        for (int j = 1; j < n; j++) {            num++;            x++;            y--;            if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0                x++;                y = 0;            }            a[x][y] = num;        }        if (i != n - 1) {            num++;            x--;            a[x][y] = num;        }    }    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            cout << a[i][j] << " ";        }        cout << endl;    }    return 0;}
希望可以帮到您!

球一个最佳答案谢谢啦!这对我非常重要!
Snipaste_2023-10-09_17-12-55.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-9 17:14:22 | 显示全部楼层
这段代码是用于生成一个蛇形矩阵的,但是缺少一些必要的信息,比如tol的定义和a数组的初始化。不过,根据代码的结构,可以看出这是一个向右上方走,向左下方走的蛇形矩阵。

如果要修改这段代码,可以根据具体需求进行修改。比如,如果需要生成一个向右下方走,向左上方走的蛇形矩阵,可以将x++改为x--,y--改为y++,即:

for(int i=0;i<tol;i++)
{
    num++;
    x--;
    y++;
    a[x][y]=num;
}

如果需要生成其他方向的蛇形矩阵,可以根据具体情况进行修改。同时,还需要注意tol和a数组的定义和初始化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-9 17:15:36 | 显示全部楼层    本楼为最佳答案   
这段代码是蛇形矩阵中右上方向的赋值操作,它会导致数组越界,因为在 y 减小到 0 后,再次执行 a[x][y]=num; 的时候,y 会变成 -1,此时就会访问数组 a 的一个不存在的位置。

要修复这个问题,可以在每次将 y 减一之前先判断一下是否越界:
++for (int i = 0; i < tol; i++) {    num++;    x++;    y--;    if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0        x++;        y = 0;    }    a[x][y] = num;}
这里加了一个判断语句来检查 y 的值是否小于 0,如果是的话就将 y 设为 0,然后向下移动一格。这样就可以避免数组越界的问题了。

除此之外,还有一些需要注意的地方,比如 tol 变量的含义不太明确,可能应该改为 n(表示矩阵的大小),num 计数器也没有初始化,可以在循环外面赋值为 0。

完整的代码如下:
++#include <iostream>using namespace std;const int MAXN = 1005;int a[MAXN][MAXN];int main() {    int n, num = 0;    cin >> n;    int x = 0, y = n - 1;    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            a[i][j] = 0;        }    }    for (int i = 0; i < n; i++) {        num++;        x++;        a[x][y] = num;        for (int j = 1; j < n; j++) {            num++;            x--;            y++;            if (x < 0) {                x = 0;            }            if (y >= n) {                y = n - 1;            }            a[x][y] = num;        }        if (i != n - 1) {            num++;            y--;            a[x][y] = num;        }        for (int j = 1; j < n; j++) {            num++;            x++;            y--;            if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0                x++;                y = 0;            }            a[x][y] = num;        }        if (i != n - 1) {            num++;            x--;            a[x][y] = num;        }    }    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            cout << a[i][j] << " ";        }        cout << endl;    }    return 0;}
希望可以帮到您!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 20:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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