存儲雪花時可以把雪花的長度和一併存儲起來,然後根據雪花的長度和做一個hash表。
判斷2個雪花是否相同,就需要從雪花a和雪花b中找到雪花臂長度相同的2個位置。然後從這2個位置開始正序,逆序比較看是否能得到相同的序列。如果得不到,就從下一次長度相同的2個位置開始正序,倒序比較。
#include <cstdio>
#include <vector>
using namespace std;
#define max_n 10003
struct node {
int snow[6];
int sum;
};
bool cmp(int a[],int b[]);
int main()
{
int l, n;
scanf("%d",&l);
while (l--)
{
node nw, cur;
int i;
vector<node> np[max_n];
int ok = 0;
scanf("%d",&n);
while (n--)
{
int nsum = 0;
for (i = 0; i < 6; i++)
{
scanf("%d",&nw.snow[i]);
nsum += nw.snow[i];
}
nw.sum = nsum;
nsum %= max_n;
if (!ok)
{
for (i = 0; i != np[nsum].size(); i++)
{
if (nw.sum != np[nsum][i].sum)
{
continue;
}
cur = np[nsum][i];
ok = cmp(nw.snow,cur.snow);
if (ok)
{
break;
}
}
if (!ok)
{
np[nsum].push_back(nw);
}
}
}
if (ok)
{
printf("Twin snowflakes found.\n");
}
else
{
printf("No two snowflakes are alike.\n");
}
}
return 0;
}
bool cmp(int a[], int b[])
{
int start = -1;
int ok = 0;
while (start < 6 && ok == 0)
{
for (start += 1;; start++)
{
if (start >= 6)
return 0;
if (a[start] == b[0])
break;
}
ok = 1;
for (int i = 0, j = start; i < 6; i++)
{
if (b[i] != a[j % 6])
{
ok = 0;
break;
}
}
if (!ok)
{
ok = 1;
for (int i = 0, j = start + 6; i < 6; i++, j--)
{
if (b[i] != a[j % 6])
{
ok = 0;
break;
}
}
}
}
return ok;
}