标题:不知道哪里出了错误
只看楼主
你爸边哭边
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2017-10-30
结帖率:66.67%
已结贴  问题点数:20 回复次数:12 
不知道哪里出了错误
链接:https://ac.
来源:牛客网

题目描述
现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。
我们现在有一次轰炸敌人的机会,轰炸敌人的区域是一个k*k的正方形区域,现在需要你解决的问题就是计算最多轰炸的敌人数量是多少。
输入描述:

本题包含多组数据,每组数据第一行输入两个数n,k。
接下来n行,每行n个数字,表示这个点上的敌人数量。
数据范围:
1<=n<=50
1<=k<=n
每个点上的敌人数量不超过100个(0<=a[i][j]<=100)。

输出描述:

每组数据输出包含一行,表示计算的结果。

示例1
输入
复制

4 2
1 1 0 0
1 1 0 0
0 0 2 2
0 0 2 2

输出
复制

8

说明

样例中,显然轰炸右下角那个部分能够击败最多的敌人



代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,k,mp[55][55],ans;
void solve(int i,int j){
    int s=0;
    if(i+k-1<n&&j+k-1<n)
    for(int x=i;x<i+k;x++)
        for(int y=j;y<j+k;y++)
            s=s+mp[x][y];
    if(s>ans){
        ans=s;
    }
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    solve(i,j);
    cout<<ans<<endl;
    return 0;
}

代码看了很多遍也看不出来哪里的逻辑有问题
搜索更多相关主题的帖子: 数据 错误 for int 描述 
2020-02-06 21:49
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:10 
程序代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,k,mp[55][55],ans;
void solve(int i,int j,int n){//这里
    int s=0;
    if(i+k-1<n&&j+k-1<n)
    for(int x=i;x<i+k;x++)
        for(int y=j;y<j+k;y++)
            s=s+mp[x][y];
    if(s>ans){
        ans=s;
    }
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    solve(i,j,n);//这里
    cout<<ans<<endl;
    return 0;
}  

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-06 23:18
你爸边哭边
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2017-10-30
得分:0 
回复 2楼 叶纤
这里n不是全局变量吗?不需要这样啊
2020-02-07 12:17
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
程序代码:
 #include<cstdio>
#include<iostream>
using namespace std;
int k,mp[55][55],ans;
void solve(int i,int j,int n){//这里
    int s=0;
    if(i+k-1<n&&j+k-1<n)
    for(int x=i;x<i+k;x++)
        for(int y=j;y<j+k;y++)
            s=s+mp[x][y];
    if(s>ans){
        ans=s;
    }
}
int main(){
    int n=0;
    cin>>n>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    solve(i,j,n);//这里
    cout<<ans<<endl;
    return 0;
}    
现在有必要了吧

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-07 12:37
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
全局定义变量只是定义了变量但并没有初始化,n的值只在主函数里有作用域,在solve里并没有作用,在solve里只是被定义了而已,你需要做的是在solve里使用n

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-07 12:52
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
。。。

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-07 14:08
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:10 
C++我没学透彻,所以没法直接指出你代码的逻辑错哪了。
作用域怎么样的我不清楚。不过代码第四行,全局变量ans并没有初始化,这肯定是错了、另外变量n要么做全局变量,要么就传参进solve函数。
为什么代码在我本机可以通过,提交到牛客网总是提示答案错误
A:牛客网的每个编程题都有10-50组测试数据,你的代码在本机可以通过仅仅是通过了样例数据,可能存在边界条件考虑不周导致更多的测试数据没有通过,所以会返回答案错误。还有一种可能是你的代码没有处理多个测试用例,例如A+B的代码需要while循环处理
1
2
3
4
5
6
7
#include <stdio.h>
int main() {
    int a,b;
    while(scanf("%d %d",&a, &b) != EOF)
        printf("%d",a+b);
    return 0;
}

程序代码:
 #include<cstdio>
#include<iostream>
using namespace std;
int k,mp[55][55],ans=0,n;
void solve(int i,int j){
    int s=0;
    for(int x=i;x<i+k;x++)
        for(int y=j;y<j+k;y++)
            s+=mp[x][y];
    if(s>ans){
        ans=s;
    }
}
int main(){
        cin>>n>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    for(int i=0;i<n-k+1;i++)
        for(int j=0;j<n-k+1;j++)
            solve(i,j);//这里
    cout<<ans<<endl;

    return 0;
}  


题目交代的很清楚,有多组测试案例。我觉得我改的这个逻辑应该对了的,只不过C++我不知道怎么写成多组循环判定的。


φ(゜▽゜*)♪
2020-02-07 16:04
叶纤
Rank: 8Rank: 8
等 级:禁止访问
威 望:1
帖 子:658
专家分:848
注 册:2019-11-22
得分:0 
我实在看不出楼上的代码和楼主的代码有啥区别,就是初始化了一个ans
实话说了吧其实楼主的代码并没有错啊,
程序代码:
  #include<cstdio>
#include<iostream>
using namespace std;
int n,k,mp[55][55],ans;
void solve(int i,int j){
    int s=0;
    if(i+k-1<n&&j+k-1<n)
    for(int x=i;x<i+k;x++)
        for(int y=j;y<j+k;y++)
            s=s+mp[x][y];
    if(s>ans){
        ans=s;
    }
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>mp[i][j];
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    solve(i,j);
    cout<<ans<<endl;
    return 0;
} 
在我的编译器测试结果是正确的啊,楼主可能想找优化版本的代码吧

把学习时间浪费在混坛上是傻瓜行为,更何况自己的水平连一两都没到。
2020-02-07 16:43
你爸边哭边
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2017-10-30
得分:0 
回复 7楼 书生牛犊
谢谢,ans是默认初始化为0了
2020-02-07 16:45
你爸边哭边
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2017-10-30
得分:0 
回复 8楼 叶纤
对啊,我看了半天也想不出来哪里错了,但是牛客网上的测试案例一个都没通过
2020-02-07 16:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499130-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.253817 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved