这段代码是蛇形矩阵中右上方向的赋值操作,它会导致数组越界,因为在 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;}
希望可以帮到您!
球一个最佳答案谢谢啦!这对我非常重要! |