这个题的搜索可以打到48分……

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=12;
bool must[N],in[N];
int cnt;
int n,a[N][N],q[N],b[N];
inline bool judge(int len,int lim){
  return lim-len>=cnt;
}
inline bool check(int len){
  register int i,j,k,pos,g;
  register bool can;
  for(i=1;i<=n;++i){
    can=false;
    for(j=1;j<=len;++j){
      if(len-j+1>=a[i][0]){
        pos=0,g=0;
        for(k=j;k<=len;++k){
          if(in[q[k]])continue;
          if(q[k]!=a[i][pos+1]){g=-1;break;}
          b[++pos]=q[k];
          in[q[k]]=true;
        }
        can=g!=-1&&pos==a[i][0];
        while(pos--)in[b[pos+1]]=false;
        if(can)break;
      }
      if(j>=a[i][0]){
        pos=0,g=0;
        for(k=j;k>0;--k){
          if(in[q[k]])continue;
          if(q[k]!=a[i][pos+1]){g=-1;break;}
          b[++pos]=q[k];
          in[q[k]]=true;
        }
        can=g!=-1&&pos==a[i][0];
        while(pos--)in[b[pos+1]]=false;
        if(can)break;
      }
    }
    if(!can)return false;
  }
  return true;
}
inline bool dfs(int pos,int lim){
  if(!judge(pos-1,lim))return false;
  if(pos==lim+1)return check(pos-1);
  register int i;
  register bool keep;
  for(i=1;i<=9;++i)
    if(i!=q[pos-1]){
      q[pos]=i;
      if(must[i]){
        must[i]=false,--cnt;
        keep=true;
      }else keep=false;
      if(dfs(pos+1,lim))return true;
      if(keep)must[i]=true,++cnt;
    }
  return false;
}
int main(){
  //freopen("rio.in","r",stdin);
  scanf("%d",&n);
  register int i,j;
  for(i=1;i<=n;++i){
    while(true){
      scanf("%d",&j);
      if(!j)break;
      a[i][++a[i][0]]=j;
      must[j]=true;
    }
  }
  for(i=1;i<=9;++i)
    cnt+=must[i];
  for(i=cnt;i<=10;++i){
    if(cnt<5&&i==10)break;
    if(dfs(1,i)){
      printf("%d\n",i);
      return 0;
    }
  }
  puts("-1");
  return 0;
}
Kod

相关文章: