您的位置:首页 > 其它

蓝桥杯 历届真题 剪邮票(枚举+判断连通性)

2018-03-29 15:52 253 查看
题目描述:如【图1.jpg】, 有12张连在一起的12生肖的邮票。


现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。




请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

int mp[10][10];
int Find;
void dfs(int x,int y)
{
if(Find==5)
return ;
int nx,ny;
for(int k=0; k<4; k++)
{
nx=dx[k]+x;
ny=dy[k]+y;
if(mp[nx][ny]==1)
{
mp[nx][ny]=-1;
Find++;
dfs(nx,ny);
}
}
}

int main()
{
int sum=0;
for(int a=1; a<=12; a++)
for(int b=a+1; b<=12; b++)
for(int c=b+1; c<=12; c++)
for(int d=c+1; d<=12; d++)
for(int e=d+1; e<=12; e++)
{
memset(mp,-1,sizeof(mp));
mp[a/5+1][(a-1)%4+1]=1;
mp[b/5+1][(b-1)%4+1]=1;
mp[c/5+1][(c-1)%4+1]=1;    //get取下标的小技巧
mp[d/5+1][(d-1)%4+1]=1;
mp[e/5+1][(e-1)%4+1]=1;
Find=1;
mp[a/5+1][(a-1)%4+1]=-1;
dfs(a/5+1,(a-1)%4+1);
if(Find==5)
sum++;
}
printf("%d\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: