Segmentation fault:段错误 这是一道二维数组题,不知道哪里越界了。请大佬帮忙

Leonard20 2018-02-22 06:05:08
#include<stdio.h>
int data[1200000];
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
int k=0,ans=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
scanf("%d",&data[k++]);
for(int i=0;i<n*m;i++)
{
int x=i-m,y=i+m,z=i+1,q=i-1;
if(i%m==m-2)
z=i;
if(i%m==0)
q=i;
if(x<0||x>=n*m)x=i;
if(y<0||y>=n*m)y=i;
if(z<0||z>=n*m)z=i;
if(q<0||q>=n*m)q=i;
if(data[x]==0 && data[y]==0&&data[z]==0&&data[q]==0&&data[i]==0)
ans++;
}
printf("%d\n",ans);
}
return 0;
}
原题如下:
题目描述
“叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有n行m列的座位而且刚好坐满。既然是上课,那老师叫学生回答问题就是再正常不过的事了,同样地,教室里也就有爱学习和不爱学习的学生了,爱学习的学生对老师提的问题都知道,而不爱学习的学生却恰好相反,对老师提的问题都不知道。爱学习的同学对别人的求助都会热情地伸以援手。
小W也在这个教室上课,但是这个时候小W却很紧张,为什么呢,因为小W就是个不爱学习的学生,对老师提的问题一个都不知道,而且这个任课老师每节课上都点名,且每次点名都是随机的。本来如果点到他他也会想尽办法求助前后左右直接相邻的同学(远了就无能为力了啊),问题就是,他前后左右都是不爱学习的同学, 所以这个时候他特别地紧张,担心下一个点到的就是自己。
同样,其他不爱学习的同学如果被点到也只能求助前后左右直接相邻的同学,要是相邻同学都不爱学习,那也会和小W一样紧张了。当然爱学习的同学肯定就不紧张啦。所以小W想知道,这节课有多少个和自己一样也在紧张的同学(当然小W自己也在紧张咯)。

输入
输入包括多组数据(组数不超过50)。每组数据格式如下:
每行一个n,m,1 <= n <= 10000, 1 <= m<=1000
接着是n行m列个数,只包含0和1,0代表该位置的学生不爱学习,1代表该位置的学生爱学习。
输出
对于每组数据,输出一个数,代表这节课上紧张的学生人数,保证答案大于零。
样例输入
2 3
0 0 0
0 0 0
3 4
1 0 1 1
0 0 0 1
1 0 1 1
样例输出
6
1
...全文
811 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leonard20 2018-02-24
  • 打赏
  • 举报
回复
虽然收获颇多,但任然没过,oj显示如下
Leonard20 2018-02-24
  • 打赏
  • 举报
回复
谢谢大佬的指点,小生收获颇多!
自信男孩 2018-02-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include <stdlib.h>

int main()
{
    int n,m;
    int *data;

    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int k=0, ans=0;
        data = (int *)malloc(n * m * sizeof(int));
        if (!data)
            exit(0);
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                scanf("%d", &data[k++]);
        for(int i=0;i<n*m;i++)
        {
            int x=i-m,y=i+m,z=i+1,q=i-1;
            if(i%m==m-2)
                z=i;
            if(i%m==0)
                q=i;
            if(x<0||x>=n*m)
                x=i;
            if(y<0||y>=n*m)
                y=i;
            if(z<0||z>=n*m)
                z=i;
            if(q<0||q>=n*m)
                q=i;
            if(data[x]==0 && data[y]==0&&data[z]==0&&data[q]==0&&data[i]==0)
                ans++;
        }
        printf("%d\n",ans);
        free(data);
    }
    return 0;
}
参考一下吧 全局变量data申请的空间过大了,建议通过malloc动态申请,根据输入的m, n值来确定要申请多大的空间。
www_adintr_com 2018-02-22
  • 打赏
  • 举报
回复
int data[1200000]; 小于最大的 n * m = 10000 *1000 = 10000000

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧