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

