POJ 3349 Snowflake Snow Snowflakes 暴力
传送门:http://poj.org/problem?id=3349
题意:先给一个数字n,然后有n行,每行6个数字,
每行的数字如果在正逆序且移位后能完全一样,
就输出 Twin snowflakes found.
否则 No two snowflakes are alike.
比如示例:
2 1 2 3 4 5 6 4 3 2 1 6 5
把第二行逆着读, 465123 然后移3 123456跟第一行一样。
思路:把每行保存,并复制出来排序(单独那一行的排序);
然后对所有数据排序,如果第一个相同 就比第二个 ……
最后只要一个 for 对 i 与 i-1 的暴力搜索就可以了。
————————————————————————————————————
渣渣之见,随便转载。
// 又到了写代码的季节了。 // 是我,是我先,明明都是我先来的,读题也好,写题也好,还是提交题目也好 // 为什么会变成这样呢……第一次有了完美的代码。有了能用一辈子的算法。 // 两件快乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。 // 到的,本该是像梦境一般幸福的时间……但是,为什么,会变成这样呢…… // 队友里有女生什么的,已经无所谓了。 #include<cstdio> #include<algorithm> #define maxn 100005 #define LL long long using namespace std; typedef struct{ int num[12]; }hehe; bool cmp(int a,int b) { return a<b; } bool cmp2(hehe a,hehe b) { if(a.num[0]!=b.num[0]) return a.num[0]<b.num[0]; if(a.num[1]!=b.num[1]) return a.num[1]<b.num[1]; if(a.num[2]!=b.num[2]) return a.num[2]<b.num[2]; if(a.num[3]!=b.num[3]) return a.num[3]<b.num[3]; if(a.num[4]!=b.num[4]) return a.num[4]<b.num[4]; return a.num[5]<b.num[5]; } bool cmp3(int *m,int *n) { if(m[0]==n[0] && m[1]==n[1] && m[2]==n[2] && m[3]==n[3] && m[4]==n[4] && m[5]==n[5]) return true; if(m[0]==n[1] && m[1]==n[2] && m[2]==n[3] && m[3]==n[4] && m[4]==n[5] && m[5]==n[0]) return true; if(m[0]==n[2] && m[1]==n[3] && m[2]==n[4] && m[3]==n[5] && m[4]==n[0] && m[5]==n[1]) return true; if(m[0]==n[3] && m[1]==n[4] && m[2]==n[5] && m[3]==n[0] && m[4]==n[1] && m[5]==n[2]) return true; if(m[0]==n[4] && m[1]==n[5] && m[2]==n[0] && m[3]==n[1] && m[4]==n[2] && m[5]==n[3]) return true; if(m[0]==n[5] && m[1]==n[0] && m[2]==n[1] && m[3]==n[2] && m[4]==n[3] && m[5]==n[4]) return true; if(m[0]==n[0] && m[5]==n[1] && m[4]==n[2] && m[3]==n[3] && m[2]==n[4] && m[1]==n[5]) return true; if(m[0]==n[1] && m[5]==n[2] && m[4]==n[3] && m[3]==n[4] && m[2]==n[5] && m[1]==n[0]) return true; if(m[0]==n[2] && m[5]==n[3] && m[4]==n[4] && m[3]==n[5] && m[2]==n[0] && m[1]==n[1]) return true; if(m[0]==n[3] && m[5]==n[4] && m[4]==n[5] && m[3]==n[0] && m[2]==n[1] && m[1]==n[2]) return true; if(m[0]==n[4] && m[5]==n[5] && m[4]==n[0] && m[3]==n[1] && m[2]==n[2] && m[1]==n[3]) return true; if(m[0]==n[5] && m[5]==n[0] && m[4]==n[1] && m[3]==n[2] && m[2]==n[3] && m[1]==n[4]) return true; return false; } hehe a[maxn]; int main() { // freopen("C:\\Users\\ZDH\\Desktop\\a.txt","r",stdin); int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { for(int j=0;j<6;j++) { scanf("%d",&a[i].num[j]); a[i].num[j+6]=a[i].num[j]; } int b[6]; for(int k=0;k<6;k++) b[k]=a[i].num[k]; sort(b,b+6,cmp); for(int k=0;k<6;k++) a[i].num[k]=b[k]; } sort(a,a+n,cmp2); int judge=0; for(int i=1;i<n;i++) if(cmp3(a[i].num+6,a[i-1].num+6)) judge=1; if(judge) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } }