五个for循环把所有数枚举出来,然后并查集判是否连接成一个整体
在连接时要注意一个特判4 5,和8 9
#include<stdio.h>
#include<algorithm>
using namespace std ;
int ne[4][2]={1,0,-1,0,0,1,0,-1};
int a[6];
int f[6];
int init()
{
for(int i=1;i<=5;i++)
f[i]=i;
return 0;
}
int find(int x)
{
if(f[x]==x)
return x;
return f[x]=find(f[x]);
}
int merge(int u,int v)
{
int t1,t2;
t1=find(u);
t2=find(v);
if(t1!=t2)
{
f[t1]=t2;
return 1;
}
return 0;
}
int main()
{
int ans=0;
for(a[1]=1;a[1]<=12;a[1]++)
{
for(a[2]=a[1]+1;a[2]<=12;a[2]++)
{
for(a[3]=a[2]+1;a[3]<=12;a[3]++)
{
for(a[4]=a[3]+1;a[4]<=12;a[4]++)
{
for(a[5]=a[4]+1;a[5]<=12;a[5]++)
{
init();
for(int i=1;i<=5;i++)
{
for(int j=i+1;j<=5;j++)
{
if(abs(a[i]-a[j])==1)
{
if(a[i]==4&&a[j]==5||a[i]==5&&a[j]==4)
continue;
if(a[i]==8&&a[j]==9||a[i]==9&&a[j]==8)
continue;
merge(i,j);
}
if(abs(a[i]-a[j])==4)
{
merge(i,j);
}
}
}
int flog=0;
for(int i=1;i<=5;i++)
if(f[i]==i)
flog++;
if(flog==1)
{
ans++;
// for(int i=1;i<=5;i++)
// printf("%d ",a[i]);
// printf("\n");
}
}
}
}
}
}
printf("%d\n",ans);
return 0;
}