Codeforces Round #363 (Div. 2), problem: (B)

来源:互联网 发布:ubuntu maven m2 编辑:程序博客网 时间:2024/06/01 07:52

题意:一个炸弹,可以消灭横竖所有墙,问是否能用一个boom消灭地图上所有墙

题解:好吧,这个有点技巧,做法是计算每一列的墙数,存在sl[],计算每一排墙数,存在sh[]中。遍历每一个点,当这个点对应的sl[i]和sh[j]之和减去(这个点是否是墙)==墙数时,则这个点成立。

(if(sh[i]+sl[j]-(maze[i][j]==’*’)==num))

#include<iostream>#include<sstream>#include<string>#include<cstdlib>#include<vector>#include<map>#include<queue>#include<stack>#include<cmath>#include<cctype>#include<set>#include<bitset>#include<algorithm>#include<list>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<ctype.h>#include<time.h>#define pr(x) cout<<#x<<"  "<<x;#define pl(x) cout<<#x<<"  "<<x<<endl;using namespace std;int sh[1002];int sl[1002];int num = 0;char maze[1005][1005];int main(){    int n,m;    scanf("%d %d",&n,&m);    getchar();    memset(sh,0,sizeof(sh));    memset(sl,0,sizeof(sl));    for(int i = 1;i<=n;i++){        for(int j = 1;j<=m+1;j++){            scanf("%c",&maze[i][j]);            if(maze[i][j]=='*'){                num++;                sh[i]++;                sl[j]++;            }        }    }    for(int i = 1;i<=n;i++){        for(int j = 1;j<=m;j++){            if(sh[i]+sl[j]-(maze[i][j]=='*')==num){                cout<<"YES"<<endl;                cout<<i<<" "<<j<<endl;                return 0;            }        }    }    cout<<"NO"<<endl;}
0 0
原创粉丝点击