POJ 3349 Snowflake Snow Snowflakes 暴力

传送门:http://poj.org/problem?id=3349

题意:先给一个数字n,然后有n行,每行6个数字,

每行的数字如果在正逆序且移位后能完全一样,

就输出 Twin snowflakes found.

否则 No two snowflakes are alike.

比如示例:

2
1 2 3 4 5 6
4 3 2 1 6 5
把第二行逆着读, 465123 然后移3 123456跟第一行一样。

思路:把每行保存,并复制出来排序(单独那一行的排序);

然后对所有数据排序,如果第一个相同 就比第二个 ……

最后只要一个 for 对 i 与 i-1 的暴力搜索就可以了。

 

————————————————————————————————————

渣渣之见,随便转载。

 

// 又到了写代码的季节了。
// 是我,是我先,明明都是我先来的,读题也好,写题也好,还是提交题目也好
// 为什么会变成这样呢……第一次有了完美的代码。有了能用一辈子的算法。
// 两件快乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。
// 到的,本该是像梦境一般幸福的时间……但是,为什么,会变成这样呢……
// 队友里有女生什么的,已经无所谓了。

#include<cstdio>
#include<algorithm>
#define maxn 100005
#define LL long long
using namespace std;

typedef struct{
    int num[12];
}hehe;

bool cmp(int a,int b)
{
    return a<b;
}

bool cmp2(hehe a,hehe b)
{

    if(a.num[0]!=b.num[0])
        return a.num[0]<b.num[0];
    if(a.num[1]!=b.num[1])
        return a.num[1]<b.num[1];
    if(a.num[2]!=b.num[2])
        return a.num[2]<b.num[2];
    if(a.num[3]!=b.num[3])
        return a.num[3]<b.num[3];
    if(a.num[4]!=b.num[4])
        return a.num[4]<b.num[4];
    return a.num[5]<b.num[5];
}

bool cmp3(int *m,int *n)
{  
    if(m[0]==n[0] && m[1]==n[1] && m[2]==n[2] && m[3]==n[3] && m[4]==n[4] && m[5]==n[5])  
        return true;  
    if(m[0]==n[1] && m[1]==n[2] && m[2]==n[3] && m[3]==n[4] && m[4]==n[5] && m[5]==n[0])  
        return true;  
    if(m[0]==n[2] && m[1]==n[3] && m[2]==n[4] && m[3]==n[5] && m[4]==n[0] && m[5]==n[1])  
        return true;  
    if(m[0]==n[3] && m[1]==n[4] && m[2]==n[5] && m[3]==n[0] && m[4]==n[1] && m[5]==n[2])  
        return true;  
    if(m[0]==n[4] && m[1]==n[5] && m[2]==n[0] && m[3]==n[1] && m[4]==n[2] && m[5]==n[3])  
        return true;  
    if(m[0]==n[5] && m[1]==n[0] && m[2]==n[1] && m[3]==n[2] && m[4]==n[3] && m[5]==n[4])  
        return true;  
    if(m[0]==n[0] && m[5]==n[1] && m[4]==n[2] && m[3]==n[3] && m[2]==n[4] && m[1]==n[5])  
        return true;  
    if(m[0]==n[1] && m[5]==n[2] && m[4]==n[3] && m[3]==n[4] && m[2]==n[5] && m[1]==n[0])  
        return true;  
    if(m[0]==n[2] && m[5]==n[3] && m[4]==n[4] && m[3]==n[5] && m[2]==n[0] && m[1]==n[1])  
        return true;  
    if(m[0]==n[3] && m[5]==n[4] && m[4]==n[5] && m[3]==n[0] && m[2]==n[1] && m[1]==n[2])  
        return true;  
    if(m[0]==n[4] && m[5]==n[5] && m[4]==n[0] && m[3]==n[1] && m[2]==n[2] && m[1]==n[3])  
        return true;  
    if(m[0]==n[5] && m[5]==n[0] && m[4]==n[1] && m[3]==n[2] && m[2]==n[3] && m[1]==n[4])  
        return true;  
    return false;  
}  

hehe a[maxn];

int main()
{
//    freopen("C:\\Users\\ZDH\\Desktop\\a.txt","r",stdin);
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<6;j++)
            {
                scanf("%d",&a[i].num[j]);
                a[i].num[j+6]=a[i].num[j];
            }
            int b[6];
            for(int k=0;k<6;k++)
                b[k]=a[i].num[k];
            sort(b,b+6,cmp);
            for(int k=0;k<6;k++)
                a[i].num[k]=b[k];
        }
        sort(a,a+n,cmp2);
        int judge=0;
        for(int i=1;i<n;i++)
            if(cmp3(a[i].num+6,a[i-1].num+6))
                judge=1;
        if(judge)
            printf("Twin snowflakes found.\n");
        else
            printf("No two snowflakes are alike.\n");
    }
    
}

 

posted @ 2016-03-17 21:46  后知后觉丶  阅读(92)  评论(0编辑  收藏  举报