codeforces 194C Cutting Figure

给一个n乘m的方格,每个格子是障碍或者空地,空地之间是四联通的,问最少在几个空格子放上障碍,可以使得原图不联通、


首先自己想想可以得到,答案不是1就是2,然后问题就简化为了检验原图是否存在割点的问题,直接dfs就可以

#include <bits/stdc++.h>
using namespace std;
typedef double ld;
typedef long long int64;
typedef signed int sint;
typedef unsigned int uint;
typedef signed long long sint64;
typedef unsigned long long uint64;
typedef pair<int,int>ii;
const int MAXN=55;
const int INF=0x7f7f7f7f;
int cases;
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
char gra[MAXN][MAXN];
bool visited[MAXN][MAXN];
int n,m;
bool notin(int x,int y){
    return x<0||y<0||x>=n||y>=m;
}
void dfs(int x,int y){
    visited[x][y]=1;
    for(int i=0;i<4;i++){
        int tx=dx[i]+x,ty=dy[i]+y;
        if(notin(tx,ty)||gra[tx][ty]=='.'||visited[tx][ty]) continue;
        dfs(tx,ty);
    }
}
bool check(){
    memset(visited,0,sizeof visited);
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(gra[i][j]=='#'&&!visited[i][j]){
                ++cnt;
                if(cnt>=2) return false;
                dfs(i,j);
            }
        }
    }
    return true;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",gra[i]);
    }
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(gra[i][j]=='.') continue;
            cnt++;
        }
    }
    if(cnt<=2){puts("-1");return 0;}

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(gra[i][j]=='#'){
                gra[i][j]='.';
                if(!check()){
                    puts("1");return 0;
                }
                gra[i][j]='#';
            }
        }
    }
    puts("2");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值