DFS——Monopole Magnets

3 篇文章 0 订阅

传送门

题解:
都不懂题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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值