zoukankan      html  css  js  c++  java
  • noi1816 画家问题(技巧搜索Dfs)

    /*
    Problem 画家问题
    假设一个ans数组存的是对每一个点的操作 0表示不图 1表示图
    那么 对于原图 g 操作第三行时对第一行没有影响 同样往下类似的
    所以 假设我们知道了ans的第一行就是最后答案的第一行 那么对于ans的第二行 就必须是的第一行全变成黄色
    以此类推 最后检验第n行 是不是全部黄色就好了
    所以只需要枚举第一行的所有情况 共2的n次方种情况 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define inff 0x7fffffff
    using namespace std;
    int n,ans[20][20],g[20][20],tmp[20][20],anss,minn=inff,tot;
    char s;
    void Printf()//计数 染了几个 
    {
        anss=0;
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
            if(ans[i][j]==1)anss++;
        minn=min(minn,anss);
    }
    void Pai()//根据ans的第一行 逐行染色 
    {
        int i,j,f=0;
        memset(tmp,0,sizeof(tmp));
        for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
            tmp[i][j]=g[i][j];
        for(i=1;i<=n;i++)
          {
              if(ans[1][i]==1)
                {
                  tmp[1][i]=!tmp[1][i];
                  tmp[1][i+1]=!tmp[1][i+1];
                  tmp[1][i-1]=!tmp[1][i-1];
                  tmp[2][i]=!tmp[2][i];
              }
          }
        for(i=2;i<=n;i++)
          for(j=1;j<=n;j++)
            if(tmp[i-1][j]==1)
              {
                tmp[i-1][j]=0;
                  ans[i][j]=1;
                  tmp[i][j]=!tmp[i][j];
                  tmp[i][j+1]=!tmp[i][j+1];
                  tmp[i][j-1]=!tmp[i][j-1];
                  tmp[i+1][j]=!tmp[i+1][j];
              }
        for(i=1;i<=n;i++)//最后检验最后一行是不是恰好全为黄色 
          if(tmp[n][i]==1)f=1;
        if(f==0)Printf();
    }
    void Dfs(int t)//枚举ans的第一行的所有情况 
    {
        if(t>n)
          {
              for(int i=2;i<=n;i++)
                for(int j=1;j<=n;j++)
                  ans[i][j]=0;
              Pai();
            return;
          }
        ans[1][t]=1;Dfs(t+1);
        ans[1][t]=0;Dfs(t+1);
    }
    int main()
    {
        int i,j;
        cin>>n;
        for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
            {
              cin>>s;
              if(s=='w')g[i][j]=1;
              else g[i][j]=0;
            }
        Dfs(1);
        if(minn<0x7fffffff)cout<<minn;
        else cout<<"inf";
    }
  • 相关阅读:
    启动 Appium 自带模拟器
    Android的一些常用命令提示符(cmd)指令
    Eclipse中没有andriod问题解决方法
    selenium键盘操作
    鼠标事件
    appium运行from appium import webdriver 提示most recent call last
    appium for windows 环境搭建
    python+Eclipse+pydev环境搭建
    nmon和nmon analyser的下载和使用
    Linux下使用NMON监控、分析系统性能
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5405658.html
Copyright © 2011-2022 走看看