B. One Bomb (#363 Div.2)
B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard output
题意:你有一个炸弹,可以放在任意位置并炸掉该位置所在的行和列上的墙“*”,求一颗炸弹是否能炸掉所有的墙。
我们可以将每行和每列的墙数分别存入数组x[]和y[]。每当a[i][j]的位置是"*"时,x[i]++,y[j]++;最后再将x[i]+y[j]与总墙数sum比较。
注意:当炸弹所在点为“*”时,需x[i]+y[j]-1;
附AC代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int N,M,ans; 7 int a[1002][1002],x[1002],y[1002]; 8 char s[200010]; 9 10 void process(){ 11 scanf("%d %d",&N,&M); 12 int cnt = 0; 13 for(int i=1; i<=N; i++){ 14 scanf("%s",s); 15 for(int j=1; j<=M; j++){ 16 if(s[j-1] == '*'){ 17 x[i]++; 18 y[j]++; 19 cnt++; 20 a[i][j] = 1; 21 } 22 } 23 } 24 for(int i=1; i<=N; i++){ 25 for(int j=1; j<=M; j++){ 26 int t; 27 t = x[i]+y[j]; 28 if(a[i][j] == 1) t--;//重复一个 29 if(t == cnt){ 30 printf("YES\n%d %d\n",i,j); 31 return; 32 } 33 } 34 } 35 printf("NO\n"); 36 } 37 38 int main(){ 39 process(); 40 return 0; 41 }