题意:*表示墙壁,一颗炸弹可以炸掉与它同一行,同一列的所有墙壁。问只用一颗炸弹是否能图中所有的墙壁炸毁,若能,给出炸弹任意一个能安放的位置?
题解:记录每一行,每一列的墙壁数,然后组合所有的行与列,代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char map[1010][1010];
int row[1010],line[1010];
int main()
{
int n,m,i,j,num;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(row,0,sizeof(row));
memset(line,0,sizeof(line));
num=0;
for(i=0;i<n;++i)
{
scanf("%s",map[i]);
for(j=0;j<m;++j)
{
if(map[i][j]=='*')
{
num++; row[i]++; line[j]++;
}
}
}
int sign=0;
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
int cnt=row[i]+line[j];
if(map[i][j]=='*')
cnt--;
if(num==cnt)
{
printf("YES\n%d %d\n",i+1,j+1);
sign=1;
break;
}
}
if(sign)
break;
}
if(!sign)
printf("NO\n");
}
return 0;
}