CodeForces

来源:互联网 发布:沈阳拼车软件 编辑:程序博客网 时间:2024/06/05 02:04

CF传送门

题意:

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

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

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


题解:

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

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

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

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


以下是我的AC代码:

//十字炸弹,按行列打表#include <cstdio>#include <cstring>#define maxn 1005using 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                flag--;            if(flag==sum)     //如果刚好炸毁所有墙,就打印结果并结束程序            {                printf("YES\n%d %d\n",i,j);                return 0;            }        }    }    printf("NO\n");    return 0;}

原创粉丝点击