剪邮票

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

这里写图片描述

这里写图片描述

这里写图片描述

答案是:116

思路:这题说实话刚开始懵了,DFS吧 感觉并不是,因为深搜的话 选一个就往回走了,感觉不是。  然后再想别的办法 ,果然蓝桥杯的题目暴力很强大,暴力出奇迹真没错。。  我就是暴力过的。。。

但是如果真的是比赛现场,哪里来的那么久的时间做呢?  做了一个多小时吧  主要是找BUg   找了很久。  总结一下,蓝桥杯一定要自己验证一下自己代码是否正确,就算验证不了,也把结果输出来看看

至少输出来的结果保证都是对的   !!!  切记!!  这也花不了多少时间  但是却能很大程度提高正确率  个人认为很不错!!!

好了 不讲废话了   思路是  : 题目就1-12个数字  你选择五个数字出来暴力,所有情况也不多计算机一秒内跑出来足够了 。  你先选出5个数字 判断这五个数字是否符合条件   判断条件也是暴力

只要人一个数字和其它数字相差1或者4就是相邻了,但是有特例(4 5  和8 9)特判一下就够了   注意还用了一下并查集,联通的归为一块  最后看是否是一块就好了 

看代码:

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int a[5];
int node[13];
int ans=0;
void Init()
{
    for(int i=0;i<13;i++) node[i]=i;
}
int Find(int x)
{
    if(x==node[x]) return x;
    return node[x]=Find(node[x]);
}
void Union(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x!=y) node[x]=y;
    return ;
}
void judge()
{
    int flag=0;
    Init();
    for(int i=0;i<5;i++)
    {
        flag=0;
        for(int j=0;j<5;j++)
        {
            int z=abs(a[i]-a[j]);
            if((z==1||z==4)&&(!(a[i]==4&&a[j]==5))&&(!(a[i]==8&&a[j]==9))&&(!(a[i]==5&&a[j]==4))&&(!(a[i]==9&&a[j]==8)))
            {
                //&&(!(a[i]==5&&a[j]==4))&&(!(a[i]==9&&a[j]==8))
                //cout<<"**"<<endl;
                Union(a[i],a[j]);
                flag=1;
                //break;
            }
        }
        if(flag==0) return ;
    }
    //for(int i=0;i<5;i++) cout<<a[i];
    //cout<<endl;
    int cnt=Find(a[0]);
    for(int i=0;i<5;i++)
    {
        if(Find(a[i])!=cnt) return ;
    }
//    for(int i=0;i<5;i++) cout<<a[i];
//    cout<<endl;
    ans++;
    return ;
}
int main()
{

    for(int i=1;i<=12;i++)
    {
        a[0]=i;
        for(int j=i+1;j<=12;j++)
        {
            a[1]=j;
            for(int k=j+1;k<=12;k++)
            {
                a[2]=k;
                for(int l=k+1;l<=12;l++)
                {
                    a[3]=l;
                    for(int r=l+1;r<=12;r++)
                    {
                        a[4]=r;
                        judge();
                    }
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/caijiaming/p/10351022.html