鱼C论坛

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

[已解决]洛谷P9117

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

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

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

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

  5. int board[MAXN][MAXN];

  6. void set_color(int opt, int x, int c, int n, int m) {
  7.         if(opt) {
  8.                 for(int i=0; i<n; ++i) {
  9.                         board[i][x] = c;
  10.                 }
  11.         }
  12.         else {
  13.                 for(int i=0; i<m; ++i) {
  14.                         board[x][i] = c;
  15.                 }
  16.         }
  17. }

  18. void print(int n, int m) {
  19.         for(int i=0; i<n; ++i) {
  20.                 for(int j=0; j<m; ++j) {
  21.                         cout << board[i][j] << " ";
  22.                 }
  23.                 cout << endl;
  24.         }
  25. }

  26. int main()
  27. {
  28.         int t=2;
  29.         cin >> t;
  30.         while(t) {
  31.                 int n, m, q; cin >> n >> m >> q;
  32.                 for(int i=0; i<q; ++i) {
  33.                         int opt, x, c; cin >> opt >> x >> c;
  34.                         set_color(opt, x, c, n, m);
  35.                 }
  36.                 print(n, m);
  37.                 memset(board, 0, sizeof(board));
  38.                 t--;
  39.         }
  40.         return 0;
  41. }
复制代码
问题:这段代码貌似很不稳定。我测试了两个相同的 C++ 文件,同样输入1,一个结束,另一个输出 01 后结束。
最佳答案
2023-9-15 09:48:29
这段代码的问题在于  board  数组的大小是  MAXN * MAXN ,而在输入数据中, n  和  m  的范围并没有限制,因此可能会导致数组越界。当  n  或  m  较小时,可能不会出现问题,但当  n  或  m  较大时,就会出现数组越界的情况,导致程序崩溃或输出错误的结果。

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

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. int board[1005][1005];

  5. void set_color(int opt, int x, int c, int n, int m) {
  6.     if(opt) {
  7.         for(int i=0; i<n; ++i) {
  8.             board[ i][x] = c;
  9.         }
  10.     }
  11.     else {
  12.         for(int i=0; i<m; ++i) {
  13.             board[x][ i] = c;
  14.         }
  15.     }
  16. }

  17. void print(int n, int m) {
  18.     for(int i=0; i<n; ++i) {
  19.         for(int j=0; j<m; ++j) {
  20.             cout << board[ i][j] << " ";
  21.         }
  22.         cout << endl;
  23.     }
  24. }

  25. int main()
  26. {
  27.     int t; cin >> t;
  28.     while(t) {
  29.         int n, m, q; cin >> n >> m >> q;
  30.         memset(board, 0, sizeof(board));
  31.         for(int i=0; i<q; ++i) {
  32.             int opt, x, c; cin >> opt >> x >> c;
  33.             set_color(opt, x, c, n, m);
  34.         }
  35.         print(n, m);
  36.         t--;
  37.     }
  38.     return 0;
  39. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-15 09:48:29 | 显示全部楼层    本楼为最佳答案   
这段代码的问题在于  board  数组的大小是  MAXN * MAXN ,而在输入数据中, n  和  m  的范围并没有限制,因此可能会导致数组越界。当  n  或  m  较小时,可能不会出现问题,但当  n  或  m  较大时,就会出现数组越界的情况,导致程序崩溃或输出错误的结果。

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

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;

  4. int board[1005][1005];

  5. void set_color(int opt, int x, int c, int n, int m) {
  6.     if(opt) {
  7.         for(int i=0; i<n; ++i) {
  8.             board[ i][x] = c;
  9.         }
  10.     }
  11.     else {
  12.         for(int i=0; i<m; ++i) {
  13.             board[x][ i] = c;
  14.         }
  15.     }
  16. }

  17. void print(int n, int m) {
  18.     for(int i=0; i<n; ++i) {
  19.         for(int j=0; j<m; ++j) {
  20.             cout << board[ i][j] << " ";
  21.         }
  22.         cout << endl;
  23.     }
  24. }

  25. int main()
  26. {
  27.     int t; cin >> t;
  28.     while(t) {
  29.         int n, m, q; cin >> n >> m >> q;
  30.         memset(board, 0, sizeof(board));
  31.         for(int i=0; i<q; ++i) {
  32.             int opt, x, c; cin >> opt >> x >> c;
  33.             set_color(opt, x, c, n, m);
  34.         }
  35.         print(n, m);
  36.         t--;
  37.     }
  38.     return 0;
  39. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-3 20:31:47 | 显示全部楼层
isdkz 的代码只有 5 分啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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