• CODEVS——T 1049 棋盘染色


    http://codevs.cn/problem/1049/

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)

    输入描述 Input Description

       输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。

    输出描述 Output Description

    输出最少需要对多少个格子进行染色

    样例输入 Sample Input

    11100

    11000

    10000

    01111

    11111

    样例输出 Sample Output

    1

    数据范围及提示 Data Size & Hint
     
     
    迭代加深搜索
    枚举每次染色的格子数,使用完所有次数后,遍历全图统计黑格子联通的个数
    染色时,可以从左上,向右下 依次进行
     1 #include <cstring>
     2 #include <cstdio>
     3 
     4 char s[5][5];
     5 int ans,tot,cnt,map[5][5];
     6 
     7 bool vis[5][5];
     8 int sx,fx[4]={0,1,0,-1};
     9 int sy,fy[4]={1,0,-1,0};
    10 
    11 void Traversal(int x,int y)
    12 {
    13     ++tot;vis[x][y]=1;
    14     for(int xx,yy,i=0; i<4; ++i)
    15     {
    16         xx=x+fx[i]; yy=y+fy[i];
    17         if(!vis[xx][yy]&&xx>=0&&xx<5&&yy>=0&&yy<5&&map[xx][yy])
    18             Traversal(xx,yy);
    19     }
    20 }
    21 
    22 bool DFS(int x,int y,int now)
    23 {
    24     if(!now)
    25     {
    26         tot=0;
    27         memset(vis,0,sizeof(vis));
    28         Traversal(sx,sy);
    29         return (ans+cnt)==tot;
    30     }
    31     for(int yy=y+1; yy<5; ++yy)
    32     {
    33         if(map[x][yy]) continue;
    34         map[x][yy]=1;
    35         if(DFS(x,yy,now-1)) return 1;
    36         map[x][yy]=0;
    37     }
    38     for(int xx=x+1; xx<5; ++xx)
    39         for(int yy=0; yy<5; ++yy)
    40         {
    41             if(map[xx][yy]) continue;
    42             map[xx][yy]=1;
    43             if(DFS(xx,yy,now-1)) return 1;
    44             map[xx][yy]=0;
    45         }
    46     return 0;
    47 }
    48 
    49 int Presist()
    50 {
    51     for(int i=0; i<5; ++i) 
    52         scanf("%s",s[i]);
    53     for(int i=0; i<5; ++i)
    54       for(int j=0; j<5; ++j)
    55       {
    56         map[i][j]=s[i][j]-'0';
    57           if(map[i][j]) cnt++,sx=i,sy=j;
    58       }  
    59     for(; !DFS(0,0,ans); ) ans++;
    60     printf("%d
    ",ans);
    61     return 0;
    62 }
    63 
    64 int Aptal=Presist();
    65 int main(){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    命令模式
    装饰者模式
    迭代器模式-统一集合的遍历方式
    springboot源码解析-管中窥豹系列之总体结构
    启动项目tomcat报错
    在项目中部署redis的读写分离架构(包含节点间认证口令)
    Redis的几个核心机制底层原理
    Java内存模型
    JAVA原子组件和同步组件
    DataGrid 删除一行数据
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7544323.html
Copyright © 2020-2023  润新知