tommyyu 发表于 2023-9-15 09:48:17

洛谷P9117

题目:https://www.luogu.com.cn/problem/P9117
代码:#include <iostream>
#include <cstring>
#define MAXN 100005
using namespace std;

int board;

void set_color(int opt, int x, int c, int n, int m) {
        if(opt) {
                for(int i=0; i<n; ++i) {
                        board = c;
                }
        }
        else {
                for(int i=0; i<m; ++i) {
                        board = c;
                }
        }
}

void print(int n, int m) {
        for(int i=0; i<n; ++i) {
                for(int j=0; j<m; ++j) {
                        cout << board << " ";
                }
                cout << endl;
        }
}

int main()
{
        int t=2;
        cin >> t;
        while(t) {
                int n, m, q; cin >> n >> m >> q;
                for(int i=0; i<q; ++i) {
                        int opt, x, c; cin >> opt >> x >> c;
                        set_color(opt, x, c, n, m);
                }
                print(n, m);
                memset(board, 0, sizeof(board));
                t--;
        }
        return 0;
}问题:这段代码貌似很不稳定。我测试了两个相同的 C++ 文件,同样输入1,一个结束,另一个输出 01 后结束。

isdkz 发表于 2023-9-15 09:48:29

这段代码的问题在于board数组的大小是MAXN * MAXN ,而在输入数据中, n和m的范围并没有限制,因此可能会导致数组越界。当n或m较小时,可能不会出现问题,但当n或m较大时,就会出现数组越界的情况,导致程序崩溃或输出错误的结果。

解决方法是将board数组的大小改为n * m ,即根据输入数据动态分配数组大小,避免数组越界的问题。修改后的代码如下:

#include <iostream>
#include <cstring>
using namespace std;

int board;

void set_color(int opt, int x, int c, int n, int m) {
    if(opt) {
      for(int i=0; i<n; ++i) {
            board[ i] = c;
      }
    }
    else {
      for(int i=0; i<m; ++i) {
            board[ i] = c;
      }
    }
}

void print(int n, int m) {
    for(int i=0; i<n; ++i) {
      for(int j=0; j<m; ++j) {
            cout << board[ i] << " ";
      }
      cout << endl;
    }
}

int main()
{
    int t; cin >> t;
    while(t) {
      int n, m, q; cin >> n >> m >> q;
      memset(board, 0, sizeof(board));
      for(int i=0; i<q; ++i) {
            int opt, x, c; cin >> opt >> x >> c;
            set_color(opt, x, c, n, m);
      }
      print(n, m);
      t--;
    }
    return 0;
}

sfqxx 发表于 2023-12-3 20:31:47

isdkz 的代码只有 5 分啊
页: [1]
查看完整版本: 洛谷P9117