CodeForces - 699B One Bomb

题目地址:http://codeforces.com/contest/699/problem/B

题目大意:

  一个矩阵,内容由‘.’和‘*’组成(‘.’ 空,‘*’ 代表墙),墙分布在不同位置,现找出一个位置放置 炸弹,炸弹能炸当前位置的一整行和一整列,如果炸弹的位置可以将所有的墙都炸掉,则输出 “YES” 并输出该位置,如果不存在这样一个位置,这输出“NO”.[炸弹可以放在空地或者墙上]

解题思路:

  1. 对每行每列的墙进行统计,如果该位置为墙,则该行的墙数++同时该列的墙++,统计出所有墙的个数cut.

  2.遍历,扫描位置,如果该位置为墙 则总墙数-1, 所在行的墙数+所在列的墙数=cut 则说明该位置可以放置炸弹且可以炸掉所有的墙,如果不存在这样一个位置则“NO”

Ac code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int xx[1005][1005];
 4 int r[1005],c[1005];
 5 int main()
 6 {
 7     int x,y,i,j;
 8     while(~scanf("%d%d",&x,&y))
 9     {
10         getchar();
11         memset(r,0,sizeof(r));
12         memset(c,0,sizeof(c));
13         int cut=0;
14         for(i=1; i<=x; i++)
15         {
16             for(j=1; j<=y; j++)
17             {
18                 xx[i][j]=getchar();
19                 if(xx[i][j]=='*')
20                 {
21                     cut++;
22                     r[i]++;
23                     c[j]++;
24                 }
25             }
26             getchar();
27         }
28         int flag=0,x1,y1;
29         for(i=1; i<=x; i++)
30             for(j=1; j<=y; j++)
31             {
32                 int sum=r[i]+c[j];
33                 if(xx[i][j]=='*')sum--;
34                 if(sum==cut)
35                 {
36                     flag=1;
37                     x1=i;
38                     y1=j;
39                     break;
40                 }
41             }
42         if(flag)
43             cout<<"YES"<<endl<<x1<<' '<<y1<<endl;
44         else cout<<"NO"<<endl;
45     }
46     return 0;
47 }

 

posted @ 2016-09-10 22:37  马丁黄瓜啊  阅读(156)  评论(0编辑  收藏  举报