题目地址: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 }