鱼C论坛

 找回密码
 立即注册
查看: 2566|回复: 10

一个代码错误原因

[复制链接]
发表于 2021-2-1 15:34:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 202021130162 于 2021-2-8 20:51 编辑

题目链接:
https://www.luogu.com.cn/problem/P2670


这是正确代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
        int a,b;
        cin>>a>>b;               //a行b列
        char m[101][101];
        int n[101][101];
        for(int i=0;i<101;i++)
                for(int j=0;j<101;j++)
                n[i][j]=0;                      //初始化 
        for(int i=0;i<a;i++)
                for(int j=0;j<b;j++)
                {
                        cin>>m[i][j];               //输入每行的地雷情况
                        if(m[i][j]=='*')
                        {
                                n[i+1][j+1]++;
                n[i+1][j-1]++;
                n[i+1][j]++;
                n[i][j+1]++;
                n[i][j-1]++;
                n[i-1][j]++;
                n[i-1][j+1]++;
                n[i-1][j-1]++;                                //相邻的八个格子都+1   
                        }
                }
        //储存完毕,开始输出
        for(int i=0;i<a;i++)
        {
                for(int j=0;j<b;j++)
                {
                        if(m[i][j]=='*')
                        cout<<"*";
                        else
                        cout<<n[i][j];
                }        
                cout<<'\n';
        }
        return 0;
}
我的问题是:
对于:
        int n[101][101];
        for(int i=0;i<101;i++)
                for(int j=0;j<101;j++)
                n[i][j]=0;                      //初始化
将这一段中的101,
1.改成输入的a和b,即n[a][b],为什么得到的结果就是错误的?
2.改成100,即n[100][100],也会有测试点无法通过?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-2 10:07:43 | 显示全部楼层
C语言不支持对数组大小进行动态定义,C99可以,改成100的话,你循环中输入了101个值,但只有100个存储空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 18:53:21 | 显示全部楼层
一世轻尘 发表于 2021-2-2 10:07
C语言不支持对数组大小进行动态定义,C99可以,改成100的话,你循环中输入了101个值,但只有100个存储空间

1.可是平时代码中可以这样啊:
int n;
cin>>n;
int a[n];
这样是可以正常运行的
2.题目范围在[1,100],将代码中所有101换成100应该也没有超出范围吧?但是题目答案还是不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 21:01:13 | 显示全部楼层
#include <bits/stdc++.h>
using namespace std;

char grid[110][110];
int ans[110][110];
int n, m;

int main(void){
        cin >> n >> m;
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        cin >> grid[i][j];
                }
        }
        
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        if(grid[i][j] == '*'){
                                if(grid[i-1][j] == '?') ans[i-1][j]++;
                                if(grid[i+1][j] == '?') ans[i+1][j]++;
                                if(grid[i][j-1] == '?') ans[i][j-1]++;
                                if(grid[i][j+1] == '?') ans[i][j+1]++;
                                if(grid[i-1][j-1] == '?') ans[i-1][j-1]++;
                                if(grid[i-1][j+1] == '?') ans[i-1][j+1]++;
                                if(grid[i+1][j-1] == '?') ans[i+1][j-1]++;
                                if(grid[i+1][j+1] == '?') ans[i+1][j+1]++;
                        }
                }
        }
        
        for(int i = 1; i <= n; i++){
                for(int j = 1; j <= m; j++){
                        if(grid[i][j] == '*') cout << "*";
                        else cout << ans[i][j];
                }
                cout << '\n';
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 21:07:13 | 显示全部楼层
你的代码是错的吧,
n,m是二维数组,你这样写n[],m[],是错的
屏幕截图 2021-02-03 210417.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-10 11:31:20 | 显示全部楼层
baige 发表于 2021-2-3 21:07
你的代码是错的吧,
n,m是二维数组,你这样写n[],m[],是错的

代码已修改,但帖子内的两个问题尚未解决,希望大牛们看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-10 12:00:39 From FishC Mobile | 显示全部楼层
202021130162 发表于 2021-2-3 18:53
1.可是平时代码中可以这样啊:
int n;
cin>>n;

标准根本就不允许, 这是非法的, g++ 给你开了后门而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-10 18:19:30 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-10 12:00
标准根本就不允许, 这是非法的, g++ 给你开了后门而已。

这样啊,就是说这种用法是错的,但是运行的时候为了体谅一下使用者还是让它跑通了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-11 21:36:33 From FishC Mobile | 显示全部楼层
202021130162 发表于 2021-2-10 18:19
这样啊,就是说这种用法是错的,但是运行的时候为了体谅一下使用者还是让它跑通了?

差不多。
变长数组是 C 标准, 不是 C++ 标准, 因此有的编译器不通过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 12:03:25 From FishC Mobile | 显示全部楼层
NOIP的题啊@weiter
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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