给一个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");
}