这个题的搜索可以打到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; }