站外题目求助
  • 板块灌水区
  • 楼主hetao6899411
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/1 10:09
  • 上次更新2023/11/2 16:50:36
查看原帖
站外题目求助
1022995
hetao6899411楼主2023/10/1 10:09

题目:

新手村 题目描述 面条老师 最近在玩一个游戏,这个游戏地图由一个 n∗m 的矩形地图构成,每个坐标都对应一个格子。

每个格子中可能存在怪物,也可能是空地,玩家需要在地图上建造防御塔来击杀怪物。

但是在这个游戏中,一个防御塔只能朝 上下左右 四个方向其中一个发射激光(攻击距离无限),当防御塔选择攻击方向以后就不允许修改了

现在 面条老师 的新手任务是选择一个空地建造一座防御塔,要求这座防御塔能击杀至少一个怪物

面条老师 希望能够完美完成新手任务,所以他想知道有多少种不同的方案来建造这座防御塔?

P.S. 同一个格子不同方向的防御塔也被认为是不同的方案

输入格式 第一行输入两个空格隔开的整数 n,m。

接下来 n 行,每行输入 m 个整数,每个整数是 0 或者 1。

0 表示这个格子是空地,

1 表示这个格子上有一个怪物。

输出格式

输出一个整数,表示合适的摆放位置总数。

输入数据 1

2 4
0 1 0 0
1 0 1 0

输出数据 1

9

输入数据 2

4 4
0 0 1 0
1 0 1 1
1 0 0 0
0 0 0 0

输出数据 2

15

样例解释 1

在 (1,1) 位置,防御塔向下和向右攻击都可以击杀怪物,有 2 种方案。

在 (1,3) 位置,防御塔向左和向下攻击都可以击杀怪物,有 2 种方案。

在 (1,4) 位置,防御塔向左攻击可以击杀怪物,有 1 种方案。

在 (2,2) 位置,防御塔向左,向右和向上攻击可以击杀怪物,有 3 种方案。

在 (2,4) 位置,防御塔向左攻击可以击杀怪物,有 1 种方案。

所以总共有 9 种方案。

数据规模:1<=n,m<=1000

可能排版有点。。。因为是复制的,有乱码,我裁减了一顿

代码:

#include<iostream>
using namespace std;
int main()
{
    freopen("new.in", "r", stdin);
    freopen("new.out", "w", stdout);
    //至少击杀一个怪物
    int n, m, game_map[1001][1001];
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>game_map[i][j];
        }
    }
    // 遍历游戏地图,发现0则扫描上下左右(很深的扫描),
    // 如果发现1则把方案数+1
    int cnt = 0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(game_map[i][j] == 0)
            {
                //开始扫描
                //上扫描
                for(int k=i-1; k >= 0; k--)
                {
                    if(game_map[k][j] == 1)
                    {
                        //如果发现怪物
                        //那么cnt++
                        cnt++;
                        // 已经是一种方案了,
                        // 直接退出上扫描
                        break;
                    }
                }
                //下扫描
                for(int k=i+1; k < n; k++)
                {
                    if(game_map[k][j] == 1)
                    {
                        cnt++;
                        break;
                    }
                }
                //左扫描
                for(int k=j-1; k >= 0; k--)
                {
                    if(game_map[i][k] == 1)
                    {
                        cnt++;
                        break;
                    }
                }
                //右扫描
                for(int k=j+1; k < m; k++)
                {
                    if(game_map[i][k] == 1)
                    {
                        cnt++;
                        break;
                    }
                }
            }
        }
    }
    cout<<cnt<<endl;
    return 0;
}

样例通过,由于赛制OI,看不到自己的分数,大家帮我分析一下我能考几分

2023/10/1 10:09
加载中...