zoukankan      html  css  js  c++  java
  • (DFS)noip2004——虫食算

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 char a[4][28];
     5 bool vix[100],vi[28];
     6 int c[100],ge=1,an[100],t;
     7 bool judge1()
     8 {
     9     char x,y,z;
    10     for(int i=t;i>0;i--)
    11     {
    12         x=a[1][i];y=a[2][i];z=a[3][i];
    13         if(an[x]!=-1&&an[y]!=-1&&an[z]!=-1&&(an[x]+an[y])%t!=an[z]&&(an[x]+an[y]+1)%t!=an[z])
    14             return false;
    15     }
    16     return true;
    17 }
    18 bool judge2()
    19 {
    20     char x,y,z;
    21     int jin=0;
    22     for(int i=t;i>0;i--)
    23     {
    24         x=a[1][i];y=a[2][i];z=a[3][i];
    25         jin=jin+an[x]+an[y];
    26         if(jin%t!=an[z])
    27             return false;
    28         jin/=t;
    29     }
    30     return true;
    31 }
    32 void dfs(int x)
    33 {
    34     int z=c[x];
    35     if(!judge1())
    36         return;
    37     if(x>t)
    38     {
    39         if(judge2())
    40         {
    41             for(int i=0;i<t;i++)
    42             {
    43                 if(i)
    44                     printf(" ");
    45                 printf("%d",an['A'+i]);
    46 
    47             }
    48             exit(0);
    49         }
    50         else
    51             return;
    52     }
    53 
    54     else
    55     {
    56         for(int i=t-1;i>=0;i--)
    57             if(!vi[i])
    58             {
    59                 vi[i]=true;
    60                 an[z]=i;
    61                 dfs(x+1);
    62                 an[z]=-1;
    63                 vi[i]=false;
    64             }
    65     }
    66 }
    67 int main()
    68 {
    69     scanf("%d",&t);
    70     int i,j;
    71     memset(an,-1,sizeof(an));
    72     for(i=1;i<=3;i++)
    73         scanf("%s",a[i]+1);
    74     for(i=t;i>0;i--)
    75         for(j=1;j<4;j++)
    76             if(!vix[a[j][i]])
    77             {
    78                 vix[a[j][i]]=true;
    79                 c[ge++]=a[j][i];
    80             }
    81     dfs(1);
    82     return 0;
    83 }

    剪枝重要性的完美体现。

    从各位开始扫,找到唯一的正确答案就exit(0)

  • 相关阅读:
    某不知名的树形Dp
    HDU-5963 朋友 思维
    CF1292C Xenon's Attack on the Gangs
    Emergency Evacuation 模拟了一下
    NOI2003 逃学的小孩
    UVA11300 Spreading the Wealth 数学
    ACWing 1510 楼梯
    测试代码高亮
    Pollard-rho的质因数分解
    米勒罗宾素数检测(Miller-Rabin)
  • 原文地址:https://www.cnblogs.com/quintessence/p/6533448.html
Copyright © 2011-2022 走看看