zoukankan      html  css  js  c++  java
  • uva11464

    通过条件约束模拟后续全状态+暴力枚举决定变量==不超时

    {或者说,一边边求解一边判断正误以减少不必要的运算}

    统一代码风格

     1 #include<iostream>
     2 #include<string.h>
     3 #include<stdio.h>
     4 using namespace std;
     5 int f[4][2]={{0,-1},{0,1},{-1,0}};
     6 const int maxn=20;
     7 int ans;
     8 int addcha;
     9 int cnt=0;
    10 int a[maxn][maxn];
    11 bool check(int n)
    12 {
    13     int aa[maxn][maxn];
    14     for(int i=0;i<n;i++)
    15     for(int j=0;j<n;j++)
    16     aa[i][j]=a[i][j];
    17     addcha=0;
    18     for (int i=0;i<n-1;i++)
    19     {
    20         for(int l=0;l<n;l++)
    21         {
    22             int num_of_1=0;
    23             for(int j=0;j<3;j++)//枚举四个方向
    24             {
    25                 int x=i+f[j][0];//表示行
    26                 int y=l+f[j][1];//表示列
    27                 if(x<0 || x>=n || y<0 || y>=n) continue;//千万不能忘了等号啊
    28                 num_of_1+=aa[x][y];
    29             }
    30             int sx=num_of_1%2;
    31             if (sx==aa[i+1][l]) continue;
    32             if (aa[i+1][l]==1) return false;else {aa[i+1][l]=sx;addcha++;}
    33         }
    34 
    35     }
    36     return true;
    37 }
    38 void dfs(int n,int x,int y,int t)//先逐个换第一行,暴力枚举
    39 {//每次遇到新状态就求出是否满足条件
    40     if(check(n))//判断满足条件
    41     {
    42          ans=min(ans,t+addcha);
    43     }
    44     if (x>=1) return;
    45     if (a[x][y]==0)
    46     {
    47         {//将a[x][y]改为1
    48             a[x][y]=1;
    49             if(y==n-1) dfs(n,x+1,0,t+1);
    50             else dfs(n,x,y+1,t+1);
    51             a[x][y]=0;
    52             if(y==n-1) dfs(n,x+1,0,t);
    53             else dfs(n,x,y+1,t);
    54         }
    55     }
    56     else
    57     {//不改变a[x][y]
    58         if(y==n-1) dfs(n,x+1,0,t);
    59         else dfs(n,x,y+1,t);
    60     }
    61 
    62 }
    63 int main()
    64 {
    65     //freopen("out.txt","w",stdout);
    66     int k;
    67     scanf("%d",&k);
    68     for(int cas=1;cas<=k;cas++)
    69     {
    70         cnt=0;
    71         int n;
    72         scanf("%d",&n);
    73         for(int i=0;i<n;i++)
    74         for(int j=0;j<n;j++)
    75         scanf("%d",&a[i][j]);
    76         ans=10000;
    77         dfs(n,0,0,0);
    78        // cout<<"cnt="<<cnt<<endl;
    79         printf("Case %d: ",cas);
    80         if (ans==10000) printf("-1
    ");else printf("%d
    ",ans);
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    ftp的虚拟用户的使用
    系统进程与线程
    mysql 100%占用的解决
    两张神图介绍python3和 2.x与 3.x 的区别
    python3中__get__,__getattr__,__getattribute__的区别
    Python 数据图表工具的比较
    Spark入门(Python)
    别学框架,学架构
    Python垃圾回收机制
    pyextend库-accepts函数参数检查
  • 原文地址:https://www.cnblogs.com/little-w/p/3343143.html
Copyright © 2011-2022 走看看