传送门
题解:
都不懂题WA了5发啊啊啊啊啊!,这道题需要注意这几个点,每一行或者每一列必须要有一个N,而且黑色的格子如果有的话必须是连续的。再者,如果某一行全是白色格子,那么对应的某一列就必须也是白色格子,不然黑色格子上的磁铁一定会被吸引过去,因为题目中提及的是所有可能,那么相反,如果满足这个条件我们就可以把磁铁放在他们的交点处,因为对于这个交点对应的行列都没有黑色格子也不存在吸引了。最后求一下联通块的个数就好了。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+7;
char a[N][N];
int res,way[4][2]={{1,0},{0,1},{-1,0},{0,-1}},n,m;
int x[N],y[N];
void dfs(int x,int y)
{
a[x][y]='.';
for(int i=0;i<4;i++){
int dx=way[i][0]+x;
int dy=way[i][1]+y;
if(dx<0||dx>=n||dy<0||dy>=m) continue;
if(a[dx][dy]=='#') dfs(dx,dy);
}
}
signed main()
{
int con=0; cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
int flag=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='#') {
if(x[i]&&j&&a[i][j-1]!='#'){
flag=0;
break;
}
if(y[j]&&i&&a[i-1][j]!='#'){
flag=0;
break;
}
x[i]=1,y[j]=1;
}
}
if(!flag) break;
}
int p=0,q=0;
for(int i=0;i<n;i++) if(!x[i]) p=1;
for(int i=0;i<m;i++) if(!y[i]) q=1;
if(p^q) flag=0;
if(!flag){
cout<<-1<<endl;
exit(0);
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='#') res++,dfs(i,j);
}
}
cout<<res<<endl;
}