CodeForces 699B One Bomb
把每一个墙的位置都存下来。
如果墙的个数$sz>n+m$,显然无解。
否则枚举炸哪一行,假设枚举炸第$i$行,去掉第$i$行的所有墙,看剩下的墙是否处于同一列,如果是,那么这就是一个解。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c = getchar(); x = 0;while(!isdigit(c)) c = getchar(); while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } } const int maxn=1010; char s[maxn][maxn]; struct X{ int r,c; }t[maxn*maxn]; int n,m,sz,f[maxn]; int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); sz=0; for(int i=0;i<n;i++) for(int j=0;j<=m;j++) if(s[i][j]=='*') t[sz].r=i,t[sz].c=j,sz++; if(sz>n+m) printf("NO\n"); else { bool fail=1; for(int i=0;i<n;i++) { int ansR=i,ansC=0; memset(f,0,sizeof f); for(int j=0;j<sz;j++) { if(t[j].r==i) continue; f[t[j].c]=1; } int sum=0; for(int j=0;j<m;j++) { if(f[j]==0) continue; ansC=j; sum=sum+f[j]; } if(sum>=2) continue; fail=0; printf("YES\n"); printf("%d %d\n",ansR+1,ansC+1); break; } if(fail) printf("NO\n"); } return 0; }