剪邮票
如图, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如图中中,粉红色所示部分就是合格的剪取。



请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
如图, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如图中中,粉红色所示部分就是合格的剪取。



请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:暴力选取所有可能五个数的组合,利用深度优先遍历查看这五个数是不是连在一起的。
#include<iostream>
#include<cstring>
using namespace std;
int i1,i2,i4,i3,i5;
int visited[13]= {0},dir[4]= {-4,1,-1,4},cnt=0;
void DFS(int i) {
if(cnt<5) {
for(int j=0; j<4; j++) {
if((i==4||i==8)&&dir[j]==1) {
continue;
}
if((i==5||i==9)&&dir[j]==-1)
continue;
int t=i+dir[j];
if(cnt<5&&t>0&&t<13&&!visited[t]&&(t==i2||t==i3||t==i4||t==i5)) {
cnt++;
visited[t]=1;
DFS(t);
}
}
}
}
int main() {
int result=0;
for(i1=1; i1<=12-4; i1++)
for(i2=i1+1; i2<=12-3; i2++)
for(i3=i2+1; i3<=12-2; i3++)
for(i4=i3+1; i4<=12-1; i4++)
for(i5=i4+1; i5<=12; i5++) {
memset(visited,0,sizeof(visited));
cnt=1;
DFS(i1);
if(cnt==5)
result++;
}
cout<<result;
return 0;
}