• 【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;
    }
    


  • 相关阅读:
    JSP中 == 和equals的区别
    使用Cookie保存用户名密码,再次登陆时将Cookie用户名密码取出来并直接放置到用户名密码文本框中
    学习Java Web开发中遇到的问题,及其解决方法
    部署、测试、服务工作的经验记录
    Python基础--dict字典操作
    Python基础--dict字典
    Python基础--预留空 5
    Python基础--预留空 4
    Python基础--tuple 元组
    Python基础--预留3
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793873.html
Copyright © 2020-2023  润新知