用开散列的方式处理哈希,才开始的时候,在isok判断两个雪花是否行等时,我错认为只要找到一个相同的数字,然后顺时针逆时针寻找如果没能查找到就算是不想等了,两组数据可能有形同的数字不知一个,所以在这里贡献了好几次WA.笨啊。。。
例如数据:
2
1 2 3 2 4 5
2 4 5 1 2 3
应该是相同的。。。
挂链方式处理。。
View Code
#include#include #include #define maxn 177777 using namespace std; struct node { int num; node *next; }*p[maxn],H[maxn]; int n,a[maxn][7],pos; bool isok(int x,int y) { int i,j; for (i = 0; i < 6; ++i) { if (a[x][i] == a[y][0]) { for (j = 1; j < 6; ++j) { if (a[x][(i + j)%6] != a[y][j]) { break; } } if (j == 6) return true; for (j = 1; j < 6; ++j) { if (a[x][(i - j + 6)%6] != a[y][j]) { break; } } if (j == 6) return true; //break;//就是因为这个break让我贡献了好几次wa。。 } } return false; } int main() { int i,j; bool flag; while (~scanf("%d",&n)) { memset(p,0,sizeof(p)); pos = 0; node *it; flag = false; for (i =0 ; i < n; ++i) { int sum = 0; for (j = 0; j < 6; ++j) { scanf("%d",&a[i][j]); sum += a[i][j]; } if (!flag) { int tmp = sum % maxn; // printf(">>%d\n",tmp); for (it = p[tmp]; it != NULL; it = it->next) { if (isok(it->num,i)) { flag = true; break; } } if (!flag) { node *q; q = &H[pos++]; q->num = i; q->next = p[tmp]; p[tmp] = q; } } } if (!flag) { printf("No two snowflakes are alike.\n"); } else { printf("Twin snowflakes found.\n"); } } return 0; }
vector<int>处理
View Code
#include#include #include #include #define maxn 100007 using namespace std; int a[maxn][10]; vector hash[maxn]; bool isok(int x,int y) { int i,j; for (i = 0; i < 6; ++i) { if (a[x][i] == a[y][0]) { for (j = 1; j < 6; ++j)//顺时针查看 { if (a[x][(i + j)%6] != a[y][j]) { break; } } if (j == 6) return true; for (j = 1; j < 6; ++j)//逆时针查看 { if (a[x][(i - j + 6)%6] != a[y][j]) { break; } } if (j == 6) return true; } } return false; } int main() { int i,j,n; while (~scanf("%d",&n)) { bool flag = false; for (i = 0; i < maxn; ++i) hash[i].clear(); for (i = 0; i < n; ++i) { int sum = 0; for (j = 0; j < 6; ++j) { scanf("%d",&a[i][j]); sum += a[i][j]; } if (!flag) { int tmp = sum%99991;//哈希映射处理 for (j = 0; j < hash[tmp].size(); ++j) { if (isok(hash[tmp][j],i))//查找是否有同构的 { flag = true; break; } } if (!flag) { hash[tmp].push_back(i); } } } if (flag) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; }