写这道题目时,发现自己也像其它人一样不会写Hash算法,没办法,去网上找了个别人的算法来,哎.....不过是自己认真写的,真的很意义!!!
写这个题目后,发现自己对数据结构中散列表查找——链接法,有了新的认识,真是个好东西啊!!呵呵。。。
const int MAX = 100000;
const int P = 33119;
int data[MAX][6];
struct link
{
int n;
link *next;
}Hash[P];
int compare(int a[], int b[])
{
for(int i=0; i<6; i++)
if(a[i] < b[i])
return -1;
else if(a[i] > b[i])
return 1;
return 0;
}
void g(int data[])
{
int i,j,k;
int a[6],b[6];
for(i=0; i<6; i++)
a[i] = data[i];
for(i=1; i<6; i++)
{
for(k=0; k<6; k++)
b[k] = data[(i+k)%6];
if(compare(b,a) == -1)
{
for(k = 0; k < 6; k++)
a[k] = b[k];
}
}
if(compare(a, data) == -1)
for(k = 0; k < 6; k++)
data[k] = a[k];
int c[6];
for(k = 0; k < 6; k++)
c[k] = data[5-k];
for(k = 0; k < 6; k++)
a[k] = c[k];
for(i=1; i<6; i++)
{
int b[6];
for(k=0; k<6; k++)
b[k] = c[(i+k)%6];
if(compare(b,a) == -1)
{
for(k = 0; k < 6; k++)
a[k] = b[k];
}
}
if(compare(a, data) == -1)
for(k = 0; k < 6; k++)
data[k] = a[k];
}
int main()
{
int i,j,k;
int t;
scanf("%d",&t);
bool flag = false;
for(i=0; i<t; i++)
{
for(j=0; j<6; j++)
scanf("%d", &data[i][j]);
if(flag == true)
continue;
g(data[i]);
k = 0;
for(j=0; j<6; j++)
k += data[i][j];
k = k%P;
link * p = &Hash[k];
while(p->next != NULL)
{
p = p->next;
int index = p->n;
if(compare(data[i], data[index]) == 0)
flag = true;
}
p->next = new link;
p->next->n = i;
p->next->next = NULL;
}
if (flag) cout << "Twin snowflakes found./n";
else cout << "No two snowflakes are alike./n";
//system("pause");
return 0;
}