zoukankan      html  css  js  c++  java
  • [codevs1049]棋盘染色<迭代深搜>

    题目链接:http://codevs.cn/problem/1049/

    昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练。

    这道题其实我看着有点懵,拿着题我就这状态↓

    然后我偷偷瞄了一眼hzwer的博客,啊♂,恍然大悟。。。。。。。

    【思路】

    根据迭代深搜的定义,我们这道题枚举要补上的黑格子数,最多是25格,所以循环ans从0到25就行,然后迭代,

    只是在每一个坐标(x,y)的扩展中,下一次的扩展是当前这第x行剩下的和接下来的几行(避免重复操作)

    然后就是在染色格子等于ans时check一下。。。。。

    check就是搜寻一次全图,当第一次找到黑格子时就从这个黑格子开始把它能到达的格子全部变成白色,然后如果还能找到黑格子,说明黑格子没有全部连通

    这是一个迭代深搜的入门题。。。不是很难,光看代码就可以理解了

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<iostream>
     7 #define maxn 6
     8 using namespace std;
     9 
    10 const int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
    11 int map[7][7],ans,flag,ins[7][7];
    12 char ch[7];
    13 
    14 void del(int x,int y)
    15 {
    16     for(int i=1;i<=4;i++)
    17     {
    18         int nx=x+dx[i],ny=y+dy[i];
    19         if(nx<1||nx>5||ny<1||ny>5)continue;
    20         if(ins[nx][ny]==1)
    21         {
    22             ins[nx][ny]=0;del(nx,ny);
    23         }
    24     }    
    25 }
    26 
    27 int check()
    28 {
    29     int tru=0;
    30     for(int i=1;i<=5;i++)
    31     for(int j=1;j<=5;j++)
    32         ins[i][j]=map[i][j];
    33     for(int i=1;i<=5;i++)
    34     for(int j=1;j<=5;j++)
    35     {
    36         if(ins[i][j]==1)
    37         {
    38             if(tru==1)return 0;
    39             else{
    40                 del(i,j);tru=1;
    41             }
    42         }
    43     }
    44     return 1;
    45 }
    46 
    47 void dfs(int x,int y,int k)
    48 {
    49     if(k==ans){
    50         if(check()){flag=1;return;}
    51     }
    52     if(flag==1||x>5||y>5)return;
    53     for(int i=y;i<=5;i++)
    54     {
    55         if(map[x][i]==0){
    56             map[x][i]=1;
    57             if(i==5)dfs(x+1,1,k+1);
    58             else dfs(x,i+1,k+1);
    59             map[x][i]=0;
    60         }
    61     }
    62     for(int i=x+1;i<=5;i++)
    63     for(int j=1;j<=5;j++)
    64     {
    65         if(map[i][j]==0){
    66             map[i][j]=1;
    67             if(j==5)dfs(i+1,1,k+1);
    68             else dfs(i,j+1,k+1);
    69             map[i][j]=0;
    70         }
    71     }
    72     return;
    73 }
    74 
    75 int main()
    76 {
    77     for(int i=1;i<=5;i++)
    78     {
    79         scanf("%s",ch+1);
    80         for(int j=1;j<=5;j++)
    81         {
    82             map[i][j]=ch[j]-'0';
    83         }
    84     }
    85     for(ans=0;ans<=25;ans++)
    86     {
    87         dfs(1,1,0);
    88         if(flag==1)
    89         {
    90             printf("%d
    ",ans);return 0;
    91         }
    92     }
    93     
    94 }
    View Code
  • 相关阅读:
    jquery 全选反选 .prop('checked',!$(this).is(':checked'));
    C#字典 Dictionary<Tkey,Tvalue> 之线程安全问题 ConcurrentDictionary<Tkey,Tvalue> 多线程字典
    javascript 获取iframe里页面中元素值的方法 关于contentWindow和contentDocumen
    WPF 之 UI 异步交互
    layui 解决从子页面传值回父页面方法
    layui 解决文本框只输入数字方法
    layui 合计出现多位小数的解决方法
    Jquery.Cookie 使用
    Git 上传代码步骤
    2分钟教你如何彻底删除Win10中 Windows.old 文件夹
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/7606984.html
Copyright © 2011-2022 走看看