题意:雪花有六角,每角有一个长度,每个雪花给出六个数代表六角长度,可以从任意个角开始沿顺时针或逆时针,n个雪花,问有没有可能有完全相同的。
分析:六个边加起来/hashsize,相同的归为一组,然后每一组判断有没有相同的,意义在于分组过程就排除了大量的情况,实现用vector好一些,我就不改了。
反思:做比赛时这题卡了很长时间最后也没出,这种情况经常出现,一些在自己能力范围之内的题因为找不着bug耽误时间,总结经验,抵bug的过程应该是这样的:在正确理解题意的前提下,1.先看有没有手下误,如没写&,for的循环变量写错,变量赋值和变化的顺序,2.数据范围,数组大小,边界处理等常见错误,3.排除以上两点,可能就是你的想法有问题了,这时应大胆怀疑自己的想法,如果整体想法正确,检查局部细节,可以排除一些确定正确的部分,认真思考一些值得怀疑的部分,检查自己的代码往往犯这样的错误,总认为自己是对的,所以一遍遍的检查没有结果。甚至有时候怀疑是题目自身的问题,这时应该明确,题没问题,还是自己的代码写挫了。(纯属牢骚)
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 10000000
#define PI acos(-1.0)
#define eps 1e-8
#define seed 131
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=100005;
int n;
struct Node
{
int s[6];
}node[maxn];
int p[1000][maxn];
bool xiangtong(Node& m,Node& n);
int main()
{
scanf("%d",&n);
int ans;
for(int i=0;i<1000;i++)
p[i][0]=0;
for(int i=0;i<n;i++)
{
ans=0;
for(int j=0;j<6;j++)
{
scanf("%d",&node[i].s[j]);
ans+=node[i].s[j];
}
ans=ans%1000;
p[ans][0]++;
p[ans][p[ans][0]]=i;
}
for(int i=0;i<1000;i++)
{
if(p[i][0]<=1)
continue;
for(int j=1;j<p[i][0];j++)
{
for(int k=j+1;k<=p[i][0];k++)
{
if(xiangtong(node[p[i][j]],node[p[i][k]]))
{
printf("Twin snowflakes found.\n");
return 0;
}
}
}
}
printf("No two snowflakes are alike.\n");
return 0;
}
/*bool xiangtong(int *a,int *b)
{
int i,j;
for(i=0; i<6; ++i)
{
for(j=0; j<6; ++j)
{
if(b[j]!=a[(i+j)%6])
break;
}
if(j==6)
return true;
for(j=0; j<6; ++j)
{
if(b[j]!=a[(i+6-j)%6])
break;
}
if(j==6)
return true;
}
return false;
}*/
bool xiangtong(Node& m,Node& n)
{
bool flag;
for(int i=0;i<6;i++)
{
if(n.s[i]==m.s[0])
{
flag=true;
for(int j=0,k=i;j<6;j++,k=(k+1)%6)
{
if(m.s[j]!=n.s[k])
{
flag=false;
break;
}
}
if(flag)
return true;
flag=true;
for(int j=0,k=i;j<6;j++)
{
if(m.s[j]!=n.s[k])
{
flag=false;
break;
}
if(k==0)
k=5;
else
k=(k-1)%6;
}
if(flag)
return true;
}
}
return false;
}