剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
//枚举所有可能的组合,然后判断是否连通
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int kind[5]; int dir[4][2]={-1,0,0,1,1,0,0,-1}; bool vis[13]; bool legal(int x,int y) { return (x>=0&&x<3&&y>=0&&y<4); } int tmpres; void dfs(int x,int y) { for(int i=0;i<4;i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(legal(xx,yy)) { int has=0; for(int j=0;j<=4;j++) if(kind[j]-1==xx*4+yy) has=1; if(has&&vis[xx*4+yy]==0) { tmpres++; vis[xx*4+yy]=1; dfs(xx,yy); } } } } int main() { int res=0; for(int i=1;i<=12;i++) { kind[0]=i; for(int j=i+1;j<=12;j++) { kind[1]=j; for(int k=j+1;k<=12;k++) { kind[2]=k; for(int e=k+1;e<=12;e++) { kind[3]=e; for(int f=e+1;f<=12;f++) { kind[4]=f; tmpres=1; memset(vis,0,sizeof(vis)); vis[kind[0]-1]=1; dfs((kind[0]-1)/4,(kind[0]-1)%4); if(tmpres==5) res++; } } } } } cout<<res<<endl; return 0; }