剪邮票java蓝桥杯_[蓝桥杯2016初赛]剪邮票

题目描述

如下图, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)

82ca0b09be05

比如,下面两张图中,粉红色所示部分就是合格的剪取。

82ca0b09be05

image

82ca0b09be05

image

请你计算,一共有多少种不同的剪取方法。

输出

请填写表示方案数目的整数。

代码

#include

#include

#include

#include

using namespace std;

int sum=0;

int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};

int visit[3][4];

int has[100010];

//每个方格看成二进制的一个位,然后比较所有位算出的十进制的数字是否一样

void dfs(int n){

if(n==5){

int temp=0;

for(int i=0;i<3;i++){

for(int j=0;j<4;j++){

temp+=visit[i][j];

temp<<=1;

}

}

if(!has[temp]){

sum++;

has[temp]=1;

}

return;

}

for(int i=0;i<3;i++){

for(int j=0;j<4;j++){

if(visit[i][j]){

for(int k=0;k<4;k++){

int xx=i+dir[k][0];

int yy=j+dir[k][1];

if(!visit[xx][yy]&&xx<3&&yy<4&&xx>=0&&yy>=0){

visit[xx][yy]=1;

dfs(n+1);

visit[xx][yy]=0;

}

}

}

}

}

}

int main()

{

for(int i=0;i<3;i++){

for(int j=0;j<4;j++){

visit[i][j]=1;

dfs(1);

visit[i][j]=0;

}

}

cout<

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值