思路:
大模拟,枚举每一个格子是否可以炸掉所有墙面就好了。
$n$ 和 $m$ 范围非常小,所以暴力完全可以过。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){//快读优化。
int x=0,f=1;
char c=getchar();
for(;c<'0'||c>'9';c=getchar())
if(c=='-')f=-1;
for(;c<='9'&&c>='0';c=getchar())
x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
int n,m,ans=0;//ans存储地图中的墙面数。
char c[1005][1005];//地图。
int h[1005]={0},l[1005]={0};//h[i]代表第i行有多少个墙,l[j]代表第j行有多少个墙。
signed main(){
n=read(),m=read();//输入。
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[i][j]=getchar();//输入。
if(c[i][j]=='*')h[i]++,l[j]++,ans++;//当前位置为墙面时,则行、列、总数组的值均加一。
}
getchar();//注意换行符。
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int sum=h[i]+l[j];//定义sum为当前位置可以炸到的所有墙面。
if(c[i][j]=='*')sum--;//可以想想为什么要特判(思考题)
if(sum==ans){//如果当前可以炸掉的墙面与地图中的墙面数相同。
cout<<"YES"<<endl<<i<<" "<<j<<endl;//输出炸弹坐标。
return 0;//结束程序。
}
}
}
cout<<"NO"<<endl;//炸不完 。
return 0;//结束程序。
}
思考题答案:
因为当前为如果是墙面的话,当前行和列都有将这个墙面算进去,所以要去重(总量 $-1$ )。