题解:P10467 [CCC 2007] Snowflake Snow Snowflakes

· · 题解

P10467 [CCC 2007] Snowflake Snow Snowflakes题解

直接上 STL

开一个 map 记录每种雪花六角长度序列是否存在,若存在,则答案为 No two snowflakes are alike.,否则,答案为 Twin snowflakes found.

本蒟蒻不会用高级的东西,只好用套了 5 重的 pair 来维护序列。

代码:

#include <bits/stdc++.h>
using namespace std ;
map <pair <int , pair <int , pair <int , pair <int , pair <int , int> > > > > , bool> mp ;
int n , a[7] , b[7] ;
pair <int , pair <int , pair <int , pair <int , pair <int , int> > > > > make()
{
    return {b[1] , {b[2] , {b[3] , {b[4] , {b[5] , b[6]}}}}} ;
}
int main()
{
    cin >> n ;
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= 6 ; j++)   cin >> a[j] , b[j] = a[j] ;
        if(mp.count(make()))
        {
            cout << "Twin snowflakes found." ;
            return 0 ;
        }
        for(int j = 1 ; j <= 6 ; j++)
        {
            int s = 0 ;
            for(int k = j ; k <= 6 ; k++)   b[++s] = a[k] ;
            for(int k = 1 ; k < j ; k++)    b[++s] = a[k] ;
            mp[make()] = 1 ;
            s = 0 ;
            for(int k = j ; k >= 1 ; k--)   b[++s] = a[k] ;
            for(int k = 6 ; k > j ; k--)    b[++s] = a[k] ;
            mp[make()] = 1 ;
        }
    }
    cout << "No two snowflakes are alike." ;
    return 0 ;
}