鱼C论坛

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

[已解决]牛客蛇形矩阵

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

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

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

x
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[1001][1001];
  4. int main()
  5. {
  6.     int n,k=1,looper,x=0,y=0,num=1,tol=0;;
  7.     cin>>n;
  8.     looper =n*n;
  9.     a[0][0]=1;
  10.     while(num<looper)
  11.     {
  12.         num++;     //a[0][1]
  13.         y++;
  14.         tol++;
  15.         a[x][y]=num;
  16.         for(int i=0;i<tol;i++)
  17.         {
  18.             num++;
  19.             x++;
  20.             y--;
  21.             a[x][y]=num;  //a[1][0]
  22.         }
  23.         num++;
  24.         x++;              //a[2][0]
  25.         tol++;   
  26.         a[x][y]=num;
  27.         for(int i=0;i<tol;i++)
  28.         {
  29.             num++;
  30.             x--;
  31.             y++;
  32.             a[x][y]=num;
  33.         }
  34.         
  35.         
  36.     }
  37.     for(int i=0;i<n;i++)
  38.     {
  39.         for(int j=0;j<n;j++)
  40.         {
  41.             cout<<a[i][j]<<" ";
  42.         }
  43.         cout<<endl;

  44.     }
  45.    
  46.    
  47.    
  48. }
复制代码

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

要修复这个问题,可以在每次将 y 减一之前先判断一下是否越界:
  1. ++
  2. for (int i = 0; i < tol; i++) {
  3.     num++;
  4.     x++;
  5.     y--;
  6.     if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0
  7.         x++;
  8.         y = 0;
  9.     }
  10.     a[x][y] = num;
  11. }
复制代码

这里加了一个判断语句来检查 y 的值是否小于 0,如果是的话就将 y 设为 0,然后向下移动一格。这样就可以避免数组越界的问题了。

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

完整的代码如下:
  1. ++
  2. #include <iostream>
  3. using namespace std;
  4. const int MAXN = 1005;
  5. int a[MAXN][MAXN];
  6. int main() {
  7.     int n, num = 0;
  8.     cin >> n;
  9.     int x = 0, y = n - 1;
  10.     for (int i = 0; i < n; i++) {
  11.         for (int j = 0; j < n; j++) {
  12.             a[i][j] = 0;
  13.         }
  14.     }
  15.     for (int i = 0; i < n; i++) {
  16.         num++;
  17.         x++;
  18.         a[x][y] = num;
  19.         for (int j = 1; j < n; j++) {
  20.             num++;
  21.             x--;
  22.             y++;
  23.             if (x < 0) {
  24.                 x = 0;
  25.             }
  26.             if (y >= n) {
  27.                 y = n - 1;
  28.             }
  29.             a[x][y] = num;
  30.         }
  31.         if (i != n - 1) {
  32.             num++;
  33.             y--;
  34.             a[x][y] = num;
  35.         }
  36.         for (int j = 1; j < n; j++) {
  37.             num++;
  38.             x++;
  39.             y--;
  40.             if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0
  41.                 x++;
  42.                 y = 0;
  43.             }
  44.             a[x][y] = num;
  45.         }
  46.         if (i != n - 1) {
  47.             num++;
  48.             x--;
  49.             a[x][y] = num;
  50.         }
  51.     }
  52.     for (int i = 0; i < n; i++) {
  53.         for (int j = 0; j < n; j++) {
  54.             cout << a[i][j] << " ";
  55.         }
  56.         cout << endl;
  57.     }
  58.     return 0;
  59. }
复制代码

希望可以帮到您!

球一个最佳答案谢谢啦!这对我非常重要!
Snipaste_2023-10-09_17-12-55.png
小甲鱼最新课程 -> https://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数组的定义和初始化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

要修复这个问题,可以在每次将 y 减一之前先判断一下是否越界:
  1. ++
  2. for (int i = 0; i < tol; i++) {
  3.     num++;
  4.     x++;
  5.     y--;
  6.     if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0
  7.         x++;
  8.         y = 0;
  9.     }
  10.     a[x][y] = num;
  11. }
复制代码

这里加了一个判断语句来检查 y 的值是否小于 0,如果是的话就将 y 设为 0,然后向下移动一格。这样就可以避免数组越界的问题了。

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

完整的代码如下:
  1. ++
  2. #include <iostream>
  3. using namespace std;
  4. const int MAXN = 1005;
  5. int a[MAXN][MAXN];
  6. int main() {
  7.     int n, num = 0;
  8.     cin >> n;
  9.     int x = 0, y = n - 1;
  10.     for (int i = 0; i < n; i++) {
  11.         for (int j = 0; j < n; j++) {
  12.             a[i][j] = 0;
  13.         }
  14.     }
  15.     for (int i = 0; i < n; i++) {
  16.         num++;
  17.         x++;
  18.         a[x][y] = num;
  19.         for (int j = 1; j < n; j++) {
  20.             num++;
  21.             x--;
  22.             y++;
  23.             if (x < 0) {
  24.                 x = 0;
  25.             }
  26.             if (y >= n) {
  27.                 y = n - 1;
  28.             }
  29.             a[x][y] = num;
  30.         }
  31.         if (i != n - 1) {
  32.             num++;
  33.             y--;
  34.             a[x][y] = num;
  35.         }
  36.         for (int j = 1; j < n; j++) {
  37.             num++;
  38.             x++;
  39.             y--;
  40.             if (y < 0) { // 如果 y 越界了,需要向下移动一格,同时将 y 设为 0
  41.                 x++;
  42.                 y = 0;
  43.             }
  44.             a[x][y] = num;
  45.         }
  46.         if (i != n - 1) {
  47.             num++;
  48.             x--;
  49.             a[x][y] = num;
  50.         }
  51.     }
  52.     for (int i = 0; i < n; i++) {
  53.         for (int j = 0; j < n; j++) {
  54.             cout << a[i][j] << " ";
  55.         }
  56.         cout << endl;
  57.     }
  58.     return 0;
  59. }
复制代码

希望可以帮到您!

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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