zoukankan      html  css  js  c++  java
  • D

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <math.h>
     4 #include <algorithm>
     5 #include <queue>
     6 #include <string.h>
     7 using namespace std;
     8 
     9 const int INF = 0xfffffff;
    10 int g[17][17];
    11 int f[17][17] = {};
    12 int ans[17][17] = {};
    13 int mmin = INF;
    14 
    15 bool judge(int n,int m)//判断最后一行是否全为0
    16 {
    17     for(int i=1;i<=m;i++)
    18     {
    19         int t = f[n][i]+f[n][i-1]+f[n][i+1]+f[n-1][i];
    20         if( (g[n][i]+t)&1 )
    21             return false;
    22         }
    23     return true;
    24 }
    25 
    26 void dfs(int n,int m,int k,int num)
    27 {
    28     if(num > mmin)//剪枝
    29         return;
    30     if(k > n)
    31     {
    32         if(judge(n, m) && mmin>num)//判断是否符合条件
    33         {
    34             memcpy(ans, f, sizeof(f));
    35             mmin = num;
    36         }
    37         return;
    38     }
    39     int t = 0;
    40     for(int i=1;i<=m;i++)
    41     {
    42         if((g[k-1][i]+f[k-2][i]+f[k-1][i-1]+f[k-1][i+1]+f[k-1][i])&1)//上一行是否为1,即是否需要翻转
    43         {
    44             f[k][i] = 1;
    45             t++;
    46         }
    47         else
    48             f[k][i] = 0;
    49     }
    50     dfs(n, m, k+1, num+t);
    51 }
    52 
    53 //n,m行列数   k当前列  num第一行翻转的次数
    54 void todfs(int n, int m, int k, int num)
    55 {
    56     if(k > m)
    57     {
    58         dfs(n, m, 2, num); //对第一行每种情况进行搜索
    59         return;
    60     }
    61     f[1][k] = 0;      //不翻转
    62     todfs(n, m, k+1, num);
    63     f[1][k] = 1;      //翻转,num+1
    64     todfs(n, m, k+1, num+1);
    65 }
    66 
    67 int main()
    68 {
    69     int n,m;
    70     cin >> n >> m;
    71     for(int i=1;i<=n;i++)
    72         for(int j=1;j<=m;j++)
    73             cin>>g[i][j];
    74     todfs(n, m, 1, 0);     //递归遍历第一行所有情况
    75     if(mmin == INF)
    76         cout<<"IMPOSSIBLE"<<endl;
    77     else
    78         for(int i=1;i<=n;i++)
    79         {
    80             for(int j=1;j<=m;j++)
    81                 cout<<ans[i][j]<<" ";
    82             cout<<endl;
    83         }
    84     return 0;
    85 }
  • 相关阅读:
    Centos 下Nginx 自启动脚本
    EUI ToggleButton ToggleSwitch 实现类似音乐开关按钮
    EUI RadioButton,RadioButtonGroup实现多选项按钮
    Theme皮肤文件(json解析、多文件管理)
    egret.Tween、egret.Ease
    Bitmap 的bitmapdata和texture区别
    在Egret实现二维码长按识别
    微信测试号实现微信分享等功能
    Egret Wing3 商城插件下载和使用
    Egret Wing3 FTP使用方法
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8972076.html
Copyright © 2011-2022 走看看