【题目描述】
你可能听说过,没有两片相同雪花。你的任务是编写一个程序来确定这是否为真。你的程序将读取收集的雪花的信息,并寻找一对相同的雪花。每个雪花有6个枝干,对于每片雪花,将会给出其每个枝干的长度。询问是否存在一对枝干相同的雪花。
【输入描述】
输入的第一行包含1个整数n(0 < n <= 100000)表示雪花的数量。后面的n行,每一行都在描述雪花。每个雪花将被描述成6个整数(每个整数大于0且小于10000000),表示雪花枝干的长度。枝干的长度可能是顺时针或逆时针排序且起点可能不相同。例如,相同的雪花可以被描述为1 2 3 4 5 6或5 4 3 2 1 6。
【输出描述】
如果所有的雪花都是不同的,输出:
No two snowflakes are alike.
如果有一对相同的雪花,输出:
Twin snowflakes found.
【样例输入】
2
1 2 3 4 5 6
4 3 2 1 6 5
【样例输出】
Twin snowflakes found.
真是太暴力了:
源代码: #include<cstdio> #include<algorithm> using namespace std; struct Node { int i[6]; }Snow[100001]; int n; bool Flag(0); bool Rule(Node t1,Node t2) { for (int a=0;a<6;a++) { if (t1.i[a]==t2.i[a]) continue; return t1.i[a]<t2.i[a]; } return Flag=1; } int main() { scanf("%d",&n); for (int a=0;a<n;a++) { for (int b=0;b<6;b++) scanf("%d",&Snow[a].i[b]); sort(Snow[a].i,Snow[a].i+6); } sort(Snow,Snow+n,Rule); if (Flag) printf("Twin snowflakes found. "); else printf("No two snowflakes are alike. "); return 0; }
源代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Node { int Floor[6]; }; int i[15000]; Node Snow[15000][100]; bool Solve(Node t1,Node t2) { sort(t1.Floor,t1.Floor+6); sort(t2.Floor,t2.Floor+6); for (int a=0;a<6;a++) if (t1.Floor[a]!=t2.Floor[a]) return false; return true; } int main() { int n; while (~scanf("%d",&n)) { memset(i,0,sizeof(i)); bool t=0; for (int a=0;a<n;a++) { int num=0; Node T; for (int b=0;b<6;b++) { scanf("%d",&T.Floor[b]); num=(num+T.Floor[b])%14997; } if (!t) { for (int b=0;b<i[num];b++) { if (Solve(T,Snow[num][b])) { t=true; break; } } Snow[num][i[num]]=T; i[num]++; } } if (t) printf("Twin snowflakes found. "); else printf("No two snowflakes are alike. "); } return 0; }