题目大意:01矩阵,1表示黑色,0表示白色,求将白色染成黑色最少的次数

使黑色成为一整个联通块。

题解:

搜索bfs 90...

dfs判断连通

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

int cnt,ans,flag;
int map[7][7],vis[7][7];
int mx[4]={1,0,0,-1},
    my[4]={0,-1,1,0};
string s;

struct node{
    int x,y;
}a[30];

inline void find(int x,int y){
    for(int i=0;i<4;i++){
        int xx=x+mx[i],yy=y+my[i];
        if(map[xx][yy]&&!vis[xx][yy]){
            vis[xx][yy]=true;
            find(xx,yy);
        }
    }
}

bool check(){
    int gg=0;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=5;i++)
     for(register int j=1;j<=5;j++)
      if(!vis[i][j]&&map[i][j]){
          gg++;if(gg>1)return false;
        vis[i][j]=true;find(i,j);
      }
    return true;
}

void dfs(int x,int sum){
    if(x==cnt+1){
        if(check())
        ans=min(ans,sum);
        return;
    }
    map[a[x].x][a[x].y]=1;    
    dfs(x+1,sum+1);
    map[a[x].x][a[x].y]=0;
    dfs(x+1,sum);
}

int main(){
    for(int i=1;i<=5;i++){
        cin>>s;
        for(int j=1;j<=5;j++){
            map[i][j]=s[j-1]-'0';
            if(!map[i][j])a[++cnt].x=i,a[cnt].y=j;
        } 
    }
    ans=5*5;
    dfs(1,0);
    printf("%d\n",ans);
    return 0;
} 
90

相关文章:

  • 2021-05-31
  • 2021-12-25
  • 2022-02-01
  • 2021-10-03
  • 2022-12-23
  • 2021-07-30
  • 2022-12-23
猜你喜欢
  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
  • 2022-02-10
  • 2021-07-25
  • 2021-07-15
  • 2021-10-09
相关资源
相似解决方案