剪邮票
(仅仅连接一个角不算相连)
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
如,
有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)
比如,
粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
bool graph[3][4];
int dfs(int num[])
{
int i,j;
int flag;
stack<int>ss;
memset(graph,false,sizeof(graph));
for(i=0;i<5;i++)
{
graph[num[i]/4][num[i]%4]=true;
}
ss.push(num[0]);
flag=0;
graph[num[0]/4][num[0]%4]=false;
while(!ss.empty())
{
int a,b;
a=ss.top();
ss.pop();
flag++;
b=a%4;
a=a/4;
for(i=0;i<4;i++)
{
if(i==0)
{
if(a-1>=0&&graph[a-1][b])
{
ss.push((a-1)*4+b);
graph[a-1][b]=false;
}
}
if(i==1)
{
if(b-1>=0&&graph[a][b-1])
{
ss.push(a*4+b-1);
graph[a][b-1]=false;
}
}
if(i==2)
{
if(a+1<3&&graph[a+1][b])
{
ss.push((a+1)*4+b);
graph[a+1][b]=false;
}
}
if(i==3)
{
if(b+1<4&&graph[a][b+1])
{
ss.push(a*4+b+1);
graph[a][b+1]=false;
}
}
}
}
if(flag==5)
return 1;
else
return 0;
}
int main()
{
int num[5];
int a,b,c,d,e;
int sum;
sum=0;
for(a=0;a<12;a++)
for(b=a+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++)
{
num[0]=a;
num[1]=b;
num[2]=c;
num[3]=d;
num[4]=e;
if(dfs(num))
sum++;//随机取五个格子
}
cout<<sum<<endl;
return 0;
}