标签:
1 2 1 2 3 4 5 6 4 3 2 1 6 5
Twin snowflakes found.
#include <stdio.h> #include <string.h> #include <vector> #define maxn 100001 #define MOD 100001 int n; struct Node { int a[6]; } snow[maxn]; std::vector<int> f[MOD]; void getData() { int i, j, sum; memset(f, 0, sizeof(f)); scanf("%d", &n); for(i = 0; i < n; ++i) { for(j = sum = 0; j < 6; ++j) { scanf("%d", &snow[i].a[j]); sum += snow[i].a[j]; } f[sum % MOD].push_back(i); } } bool Judge(int x, int y) { int i, j, count; for(i = 0; i < 6; ++i) { if(snow[x].a[i] == snow[y].a[0]) { for(count = j = 0; j < 6; ++j) if(snow[x].a[(i+j)%6] == snow[y].a[j]) ++count; if(count == 6) return true; for(count = j = 0; j < 6; ++j) if(snow[x].a[((i-j)%6+6)%6] == snow[y].a[j]) ++count; if(count == 6) return true; } } return false; } bool test(int k, int m) { int i, j; for(i = 0; i < m; ++i) for(j = i + 1; j < m; ++j) if(Judge(f[k][i], f[k][j])) return true; return false; } void solve() { int i, j, k, ok = 0; for(i = 0; i < MOD; ++i) if(!f[i].empty() && test(i, f[i].size())) { ok = 1; break; } printf(ok ? "Twin snowflakes found.\n" : "No two snowflakes are alike.\n"); } int main() { // freopen("stdin.txt", "r", stdin); int t; scanf("%d", &t); while(t--) { getData(); solve(); } return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxn 100001 int n; struct Node { int a[6]; Node *next; }; struct Node2 { int sum; Node2 *nextNode2; Node *next; } root; void insertNode(Node2 *n2p, Node tmp) { Node *p = (Node *) malloc(sizeof(Node)); *p = tmp; p->next = n2p->next; n2p->next = p; } void insertNode2(int sum, Node tmp) { Node2 *p = root.nextNode2, *q = &root; while(true) { if(!p || p->sum > sum) { Node2 *temp = (Node2 *) malloc(sizeof(Node2)); temp->sum = sum; temp->nextNode2 = p; temp->next = NULL; q->nextNode2 = temp; insertNode(temp, tmp); return; } else if(p->sum == sum) { insertNode(p, tmp); return; } q = p; p = p->nextNode2; } } void destoryNode(Node *p) { Node *q; while(p) { q = p; p = p->next; free(q); } } void destoryNode2(Node2 *p) { Node2 *q; while(p) { destoryNode(p->next); q = p; p = p->nextNode2; free(q); } } void getData() { int i, j, sum; Node tmp; destoryNode2(root.nextNode2); root.nextNode2 = NULL; root.next = NULL; root.sum = -1; scanf("%d", &n); for(i = 0; i < n; ++i) { for(j = sum = 0; j < 6; ++j) { scanf("%d", &tmp.a[j]); sum += tmp.a[j]; } insertNode2(sum, tmp); } } bool JudgeArr(int a[], int b[]) { int i, j, cnt; for(i = 0; i < 6; ++i) { if(a[i] == b[0]) { for(j = cnt = 0; j < 6; ++j) if(a[(i+j)%6] == b[j]) ++cnt; if(cnt == 6) return true; for(j = cnt = 0; j < 6; ++j) if(a[(i-j+6)%6] == b[j]) ++cnt; if(cnt == 6) return true; } } return false; } bool JudgeList(Node *pn) { Node *p1, *p2; for(p1 = pn; p1; p1 = p1->next) { for(p2 = p1->next; p2; p2 = p2->next) if(JudgeArr(p1->a, p2->a)) return true; } return false; } void solve() { Node *np; for(Node2 *n2p = root.nextNode2; n2p; n2p = n2p->nextNode2) { if(JudgeList(n2p->next)) { printf("Twin snowflakes found.\n"); return; } } printf("No two snowflakes are alike.\n"); } int main() { // freopen("stdin.txt", "r", stdin); int t; scanf("%d", &t); while(t--) { getData(); solve(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/4180520.html