zoukankan      html  css  js  c++  java
  • 【NOIP2004提高组T4】虫食算-搜索剪枝

    测试地址:虫食算

    做法:稀里糊涂就过了...好像有多种剪枝方法,这里说说我的做法:首先,按照字母的出现顺序依次枚举字母的值。注意,这里的出现顺序指,出现的位数越低越先,位数相同则越在下面越先。然后加可行性剪枝,即对于某一列如果所有值(从上到下设为A,B,C)都已经求出,但是(A+B)%n和(A+B+1%n)都不等于C,则说明当前方案错误,直接剪掉。加了这个剪枝之后就可以过了。网上还有很多大牛有各种其他的剪枝方法,本蒟蒻太弱了所以不会...还有待学习!

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n,a[4][25],val[25],ap[25];
    bool used[25]={0};
    
    bool check()
    {
      int in=0;
      for(int i=n;i>=1;i--)
      {
        if ((val[a[1][i]]+val[a[2][i]]+in)%n!=val[a[3][i]]) return 0;
        in=(val[a[1][i]]+val[a[2][i]]+in)/n;
      }
      if (in==0) return 1;
      else return 0;
    }
    
    bool check2()
    {
      for(int i=n;i>=1;i--)
      {
        if (val[a[1][i]]!=-1&&val[a[2][i]]!=-1&&val[a[3][i]]!=-1)
    	  if ((val[a[1][i]]+val[a[2][i]])%n!=val[a[3][i]]
    	     && (val[a[1][i]]+val[a[2][i]]+1)%n!=val[a[3][i]]) return 1;
      }
      return 0;
    }
    
    bool search(int step)
    {
      if (step>n)
      {
        if (check()) return 1;
    	else return 0;
      }
      if (check2()) return 0;
      for(int i=n-1;i>=0;i--)
        if (!used[i])
    	{
    	  used[i]=1;val[ap[step]]=i;
    	  if (search(step+1)) return 1;
    	  used[i]=0;val[ap[step]]=-1;
    	}
      return 0;
    }
    
    int main()
    {
      scanf("%d",&n);
      for(int i=1;i<=3;i++)
      {
        getchar();
    	for(int j=1;j<=n;j++)
    	{
    	  char c;
    	  scanf("%c",&c);
    	  a[i][j]=c-'A';
        }
      }
      
      int tot=0;
      for(int j=n;j>=1;j--)
        for(int i=3;i>=1;i--)
    	  if (!used[a[i][j]]) {ap[++tot]=a[i][j];used[a[i][j]]=1;}
      
      memset(used,0,sizeof(used));
      for(int i=0;i<n;i++)
        val[i]=-1;
      search(1);
      
      for(int i=0;i<n;i++) printf("%d ",val[i]);
      
      return 0;
    }
    


  • 相关阅读:
    mogodb 设置用户名密码认证
    axon mogoconfig
    ListUtils 对 list数据 分组 ,统计,求和 。。。
    jQuery 之 dom操作
    学习Java第二天
    字节跳动spring面试题,你能回答出几个
    CH340芯片选型
    Django的路由转换器的使用
    Vue之cli脚手架
    String中split(regex,limit)方法讲解
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793873.html
Copyright © 2011-2022 走看看