16年第七届蓝桥杯第七题_剪邮票

剪邮票

如【图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;
}

 

posted on 2017-04-04 11:43  JASONlee3  阅读(540)  评论(0编辑  收藏  举报

导航