剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<bits/stdc++.h>
using namespace std;
int mapp[12]={1,2,3,4,6,7,8,9,11,12,13,14};
int dir[4]={-1,1,5,-5};
int p[10],sum,flag,vis[10];
void dfs(int x)
{
for(int i=0;i<4;i++)
{
int dx=p[x]+dir[i];
if(dx<1||dx>14||dx==5||dx==10)
continue;
for(int j=0;j<5;j++)
{
if(!vis[j]&&dx==p[j])
{
vis[j]=1;
dfs(j);
}
}
}
}
int main()
{
for(int a1=0;a1<12;a1++)
{
for(int a2=a1+1;a2<12;a2++)
{
for(int a3=a2+1;a3<12;a3++)
{
for(int a4=a3+1;a4<12;a4++)
{
for(int a5=a4+1;a5<12;a5++)
{
p[0]=mapp[a1];
p[1]=mapp[a2];
p[2]=mapp[a3];
p[3]=mapp[a4];
p[4]=mapp[a5];
memset(vis,0,sizeof(vis));
vis[0]=1;
dfs(0);
flag=1;
for(int i=0;i<5;i++)
{
if(!vis[i])
{
flag=0;
break;
}
}
if(flag==1)
sum++;
}
}
}
}
}
cout << sum << endl;
return 0;
}
答案116