剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
![](https://i-blog.csdnimg.cn/blog_migrate/0f1b9de3940e7a221957809c9e0f66c4.jpeg)
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
int dx[]= {-1,0,1,0};
int dy[]= {0,1,0,-1};
int vis[3][4];
struct node
{
int x;
int y;
} f,g;
int sum;
int bfs(int index,int step)
{
int ans=0;
queue<node> q;
f.x=index/4;
f.y=index%4;
q.push(f);
vis[f.x][f.y]=0;
while(!q.empty())
{
f=q.front();
q.pop();
if(step==5)
return 1;
for(int i=0; i<4; i++)
{
g.x=f.x+dx[i];
g.y=f.y+dy[i];
if(vis[g.x][g.y]&&g.x>=0&&g.x<3&&g.y>=0&&g.y<4)
{
vis[g.x][g.y]=0;
step=step+1;
q.push(g);
}
}
}
return 0;
}
int main()
{
sum=0;
for(int i=0; i<12-4; i++)
{
for(int j=i+1; j<12-3; j++)
{
for(int l=j+1; l<12-2; l++)
{
for(int h=l+1; h<12-1; h++)
{
for(int g=h+1; g<12; g++)
{
memset(vis,0,sizeof(vis));
vis[i/4][i%4]=1;
vis[j/4][j%4]=1;
vis[l/4][l%4]=1;
vis[h/4][h%4]=1;
vis[g/4][g%4]=1;
// for(int a=0;a<3;a++){
// for(int b=0;b<4;b++){
// printf("%d",vis[a][b]);
// }
// printf("\n");
// }
// printf("\n");
if(bfs(i,1))
{
sum++;
}
}
}
}
}
}
printf("%d\n",sum);
return 0;
}