现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:
首先想到先从12个数中找5个数,列出所有可能,然后再判断这5个数是否相连。。
代码:
#include<iostream>
using namespace std;
int map[12]={1,2,3,4,6,7,8,9,11,12,13,14};
int aa[5],vis[5],sum=0;
int b[4]={-1,1,-5,+5};
int c[5];
void dfs(int n)
{
for(int i=0;i<4;i++)
{
int t=aa[n]+b[i];
if(t<1 && t>14 || t==5 || t==10) //t等于5 和 t=10 是为了将3行隔开, 4 不能让它加1到5
continue;
for(int j=0;j<5;j++)
{
if(!vis[j] && aa[j]==t)
{
vis[j]=1;
dfs(j);
}
}
}
}
int main()
{
for(c[0]=0;c[0]<12;c[0]++)
{
for(c[1]=c[0]+1;c[1]<12;c[1]++)
{
for(c[2]=c[1]+1;c[2]<12;c[2]++)
{
for(c[3]=c[2]+1;c[3]<12;c[3]++)
{
for(c[4]=c[3]+1;c[4]<12;c[4]++)
{
aa[0]=map[c[0]];
aa[1]=map[c[1]];
aa[2]=map[c[2]];
aa[3]=map[c[3]];
aa[4]=map[c[4]];
for(int 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;
}