剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码有点辣眼睛,不想再写了
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
using namespace std;
int map[5][6]={0};
int a[15]={1,2,3,4,5,6,7,8,9,10,11,12};
typedef struct node
{
int x,y;
}No;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int sd=0;
queue<No>Q;
int cc()
{
int i,j;
for(i=1;i<=3;i++)
{
for(j=1;j<=4;j++)
{
if(map[i][j]==1&&map[i-1][j]==0&&map[i+1][j]==0&&map[i][j+1]==0&&map[i][j-1]==0)
return 0;
}
}
return 1;
}
int check()
{int j;
int xx,yy;
int i,s,t;
int mm[5][6]={0};
for(i=1;i<=3;i++)
{
for(j=1;j<=4;j++)
{
mm[i][j]=map[i][j];
if(mm[i][j]==1)
{
xx=i;
yy=j;
}
}
}
j=0;
No a={xx,yy};
Q.push(a);
while(!Q.empty())
{
a=Q.front();
Q.pop();
for(i=0;i<4;i++)
{
s=a.x+dir[i][0];
t=a.y+dir[i][1];
if(s>=0&&t>=0&&s<=4&&t<=5&&mm[s][t]==1)
{
j++;
mm[a.x][a.y]=0;
No b={s,t};
Q.push(b);
}
}
}
if(j>=4&&cc())
return 1;
return 0;
}
void dfs(int x,int ss)
{
if(ss==5)
{
if(check()==1)
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=4;j++)
printf("%d ",map[i][j]);
printf("\n");
}
sd++;
printf("%d++++++++++++++\n",sd);
}
return ;
}
if(x>=12)
{
return ;
}
map[x/4+1][x%4+1]=1;
dfs(x+1,ss+1);
map[x/4+1][x%4+1]=0;
// vis[x]=0 ;
dfs(x+1,ss);
}
int main()
{
dfs(0,0);
printf("%d\n",sd);
}