您的位置:首页 > 其它

CodeForces - 699B One Bomb 一颗炸弹 基础题 打表

2017-07-11 19:44 387 查看
CF传送门





题意:

1. 一张地图(二维数组建立的图)上存在墙(*)和空地(.)

2. 给你一颗炸弹,要求放在地图上的某一点可以炸毁所有墙,炸弹可以无视距离炸毁上下左右四个方向所有东西

3. 如果可以炸毁所有墙就输出YES并输出炸弹放置点,否则直接输出NO

题解:

1. 我原本是遍历整张图来计算,然后妥妥的超时

2. 打表,把每一行上的墙数量存到一个数组,再把每一列上的墙数量存到另一个数组

3. 遍历地图,把两个数组相加,再判断炸弹所在点的情况即可

4. 如果炸弹放置点是墙,则对应行列相加后要减1,否则不变

以下是我的AC代码:

//十字炸弹,按行列打表
#include <cstdio>
#include <cstring>
#define maxn 1005
using namespace std;

char s[maxn][maxn]; //存储地图
int r[maxn],l[maxn]; //存储行列炸弹数量

int main()
{
memset(r,0,sizeof(r));
memset(l,0,sizeof(l));
int n,m,sum=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=m;j++)
{
scanf("%c",&s[i][j]);
if(s[i][j]=='*')
{
sum++; //计算总墙数量
r[i]++; //对应行墙数量+1
l[j]++; //对应列墙数量+1
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int flag=r[i]+l[j];
if(s[i][j]=='*') //如果炸弹放置点是墙就墙数量减1
fl
4000
ag--;
if(flag==sum) //如果刚好炸毁所有墙,就打印结果并结束程序
{
printf("YES\n%d %d\n",i,j);
return 0;
}
}
}
printf("NO\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: