激光炮(改)(C++、C语言)

题目描述
小T在上电脑课的时候,写了一个游戏。

游戏的内容是:在n*n的矩阵里,有若干个敌人。你可以选择一个 没有敌人 的位置放置激光炮,激光炮会朝左上角和左下角两个方向发射激光,能消灭与激光炮距离为1的敌人。

目前只能部署一次激光炮,请问把激光炮放置在哪个位置上消灭的敌人数量最多。

输入格式
第一行一个正整数 n ,表示矩阵的大小。

接下来 n 行,每行 n 个整数 x (0≤x≤9),表示敌人的数量。

输出格式
一个整数,表示最多能消灭的敌人数量。

img

遍历所有0的位置,统计左上和左下格的数值和,取最大值

#include <stdio.h>
int a[1000][1000];
int main()
{
    int n,i,j,max=0,e=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<n;i++)
        for(j=1;j<n;j++)
        {
           if(a[i][j] == 0)
           {
              e = 0;
              if(i>0)
                 e += a[i-1][j-1];
              if(i<n-1)
                 e += a[i+1][j-1];    
              if(e > max)
                  max = e;
           }
        }
    printf("%d",max);
}

遍历所有敌人数量为0的节点,计算每个点左下角和左上角敌人的和,求最大值就可以。
需要注意的是,保存敌人数量的二维数组,如果用int a[1000][1000],在部分编译器中可能导致占用缓存过大而导致程序崩溃。因为每个点的敌人数量小于等于9,所以,可以用char a[1001][1001]来保存。
运行结果:

img

C代码:

#include <stdio.h>
int main()
{
    char a[1001][1001] = {0};
    int i, j, n;
    int max = 0;  //记录消灭的最大敌人数量
    int t; 
    scanf("%d",&n);  //输入n
    //输入各位置敌人的数量
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &t);
            a[i][j] = t;
        }
    }
    //遍历所有敌人数量为的0的位置
    for (i = 0; i < n; i++)
    {
        for (j = 1; j < n; j++) //因为第0列左上角和左下角没有敌人,所以j从1开始就可以
        {
            if (a[i][j] == 0)
            {
                t = 0; //记录该位置能消灭敌人的数量
                if (i == 0) //第一行,仅考虑左下角
                {
                    t = a[i + 1][j - 1];
                }
                else if (i == n - 1) //最后一行,仅考虑左上角
                {
                    t = a[i - 1][j - 1];
                }
                else //其它行
                {
                    t = a[i - 1][j - 1] + a[i + 1][j - 1]; //左上角+左下角
                }
                if (t > max)
                    max = t; //如果t比max大,更新max
            }
            
        }
    }
    printf("%d", max);
    return 0;
}

C++代码:

#include <iostream>
using namespace std;
int main()
{
    char a[1001][1001] = {0};
    int i, j, n;
    int max = 0;  //记录消灭的最大敌人数量
    int t; 
    cin >> n;  //输入n
    //输入各位置敌人的数量
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            cin >> t;
            a[i][j] = t;
        }
    }
    //遍历所有敌人数量为的0的位置
    for (i = 0; i < n; i++)
    {
        for (j = 1; j < n; j++) //因为第0列左上角和左下角没有敌人,所以j从1开始就可以
        {
            if (a[i][j] == 0)
            {
                t = 0; //记录该位置能消灭敌人的数量
                if (i == 0) //第一行,仅考虑左下角
                {
                    t = a[i + 1][j - 1];
                }
                else if (i == n - 1) //最后一行,仅考虑左上角
                {
                    t = a[i - 1][j - 1];
                }
                else //其它行
                {
                    t = a[i - 1][j - 1] + a[i + 1][j - 1]; //左上角+左下角
                }
                if (t > max)
                    max = t; //如果t比max大,更新max
            }
            
        }
    }
    cout << max;
    return 0;
}


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

int main() {
    int n;
    cin >> n;

    vector<vector<int>> grid(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> grid[i][j];
        }
    }

    int max_killed = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (grid[i][j] != 0) {  // 如果这个位置上有敌人,不能放置激光炮
                continue;
            }
            int killed = 0;
            // 向左上方向遍历
            int x = i - 1, y = j - 1;
            while (x >= 0 && y >= 0) {
                if (grid[x][y] == 1) {
                    killed++;
                }
                x--, y--;
            }
            // 向左下方向遍历
            x = i + 1, y = j - 1;
            while (x < n && y >= 0) {
                if (grid[x][y] == 1) {
                    killed++;
                }
                x++, y--;
            }
            // 更新最大值
            max_killed = max(max_killed, killed);
        }
    }

    cout << max_killed << endl;

    return 0;
}

这题我都看不懂
“激光炮会朝左上角和左下角两个方向发射激光,能消灭与激光炮距离为1的敌人”
别管往哪个方向发射,这里只发射2束激光没错吧
而且只能消灭距离1的敌人,也就是说不能穿透整行
那满打满算最多每条激光只能消灭一个敌人,答案3是怎么来的?

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632