7 条题解

  • 0
    @ 2025-12-24 18:29:28
    #include <bits/stdc++.h>
    unordered_map<string,int> mp;
    // 存储一片雪花的六个角的长度(下标1~6)
    string a[7];
    int n;
    
    // 向哈希表中添加一种雪花的字符串表示
    // x1: 起始角编号(1~6)
    // x2: 步长,1表示顺时针,-1表示逆时针
    void add(int x1, int x2)
    {
    	string s="";
    	int i=x1;
    	do
    	{
    		s+=a[i]; // 拼接当前角的长度
    		i=(i+x2+5)%6+1; // 计算下一个角的编号,循环取模
    	}while(i!=x1); // 回到起始角时结束
    	if(mp[s]) // 如果该字符串已经出现过
    	{
    		cout<<"Twin snowflakes found."; // 找到相同的雪花
    		exit(0); // 直接退出程序
    	}else{
            mp[s]++;//没有出现过,加入哈希表,key对应的value+1
        }
    }
    
    int main()
    {
    	ios::sync_with_stdio(0); // 加速输入输出
    	cin.tie(0);
    	cout.tie(0); 
    	cin>>n; // 读入雪花数量
    	for (int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=6;j++)
    		{
    			cin>>a[j]; // 读入一片雪花的六个角
    		}
    		for(int j=1;j<=6;j++)
    		{
                //相当于每个雪花维护了两种字符串,一种顺时针,一种逆时针
                //每种字符串有6个(对应6个旋转角度),加入哈希表
    			add(j,-1); // 以第j个角为起点,逆时针生成字符串
    			add(j,1);  // 以第j个角为起点,顺时针生成字符串
    		}
    	}
    	cout<<"No two snowflakes are alike."; // 没有找到相同的雪花
    }
    

    信息

    ID
    14976
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    4
    已通过
    3
    上传者