首先吐槽一下出题人没节操,相邻的距离算为0居然!
每次选最近的是存在bug的,数据我不记得了,是姚神出的,取最远的也是存在bug的,比如3 4 0 3 0 4 3 0 0 3 0 0,那么我能想到的方法也便只有搜索了,剪了两个枝,第一是每种必须出现偶数次否则无解,第二是配对的时候连续一段都可以配对,和其中任意一个配对结果不变,只需要搜索一次,少一个剪枝都是过不了的
#include <cstdio>
#include <cstring>
int a[1200],n,i,j,r;
bool p[1200];
bool dfs(int x)
{
if(x==0)return true;
if(p[x])return dfs(x-1);
int i,dis=0;
bool pd=0;
for(i=x-1; i>0; i--)
{
if(p[i])continue;
dis++;
if(dis>5)break;
if(a[i]==a[x])
{
if(!pd)
{
p[i]=1;
if(dfs(x-1))
{
return true;
}
p[i]=0;
pd=1;
}
}
else pd=0;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)==1)
{
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
for(i=1; i<=n; i++)
{
r=0;
for(j=1; j<=n; j++)
if(a[i]==a[j])r++;
if(r&1)break;
}
if((n&1)||(r&1))
{
puts("0");
continue;
}
memset(p,0,sizeof(p));
printf("%d\n",dfs(n));
}
return 0;
}