题目:
新手村 题目描述 面条老师 最近在玩一个游戏,这个游戏地图由一个 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,看不到自己的分数,大家帮我分析一下我能考几分