剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:暴力,我们先从12个数中找出来5个数,把所有可能罗列出来,再逐一判断是否满足条件,满足条件方案数就加1.
为避免判断条件繁琐,存的时候可以巧一点,这一点也是我借鉴的来的。
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[12]={1,2,3,4,6,7,8,9,11,12,13,14};
int map[5];
int vis[5],sum=0;
int b[4]={-1,1,-5,5};
void dfs(int n)
{
int i;
for(i=0;i<4;i++)
{
int t=map[n]+b[i];
if(t<1||t>14||t==5||t==10)
continue;
for(int j=0;j<5;j++)
{
if(!vis[j]&&map[j]==t)
{
vis[j]=1;
dfs(j);
}
}
}
}
int main()
{
int x,b,c,d,e;
int i,j;
for(x=0;x<12;x++)
{
for(b=x+1;b<12;b++)
{
for(c=b+1;c<12;c++)
{
for(d=c+1;d<12;d++)
{
for(e=d+1;e<12;e++)
{
map[0]=a[x];
map[1]=a[b];
map[2]=a[c];
map[3]=a[d];
map[4]=a[e];
for(i=0;i<5;i++)
vis[i]=0;
//vis[0]=1;
dfs(0);
int flag=1;
for(int i=0;i<5;i++)
{
if(vis[i]!=1)
{
flag=0;
break;
}
}
if(flag==0)
continue;
else
sum++;
}
}
}
}
}
cout<<sum<<endl;
return 0;
}