poj3349 只要用上hash就没问题了,还有主要要用scanf,否则会超时。
wa了无数次,是因为cmp函数还写好,细节决定成败。
本来以为找k只要找出第一次相等的那个就行了其实这样是错误的 这样的话,6 2 2 1 1 6和 6 6 2 2 1 1就没办法相同。
所以找k必须是只要相等就得继续比较下去。
Source Code
Problem: 3349 | User: 64162451 | |
Memory: 3724K | Time: 3141MS | |
Language: C++ | Result: Accepted |
- Source Code
#include<iostream> #include<fstream> #include<vector> using namespace std; const int N=100010; int arm[N][6]; const int prime=14997; vector<int> hash1[prime]; bool cmp(int a,int b) { for(int k=0;k<6;k++) if(arm[a][0]==arm[b][k]) { bool flag=false; for(int i=0;i<5;i++) if(arm[a][1+i]!=arm[b][(k+i+1)%6]) { flag=true; break; } if(!flag) return true; flag=false; for(int i=0;i<5;i++) if(arm[a][1+i]!=arm[b][(k-i-1+6)%6]) { flag=true; break; } if(!flag) return true; } return false; } bool cmp2(int a, int b){ // 比较两片雪花时候是相同的。 int i, j; for(i = 0; i < 6; i++) if(arm[a][0] == arm[b][i]){ for(j = 1; j < 6; j ++) // 顺时针方向比较。 if(arm[a][j] != arm[b][(i+j)%6]) // 除6取模这个方法该学。 break; if(j == 6) return true; for(j = 1; j < 6; j++) // 逆时针方向比较。 if(arm[a][6-j] != arm[b][(i+j)%6]) break; if(j == 6) return true; } return false; } bool check() { for(int k=0;k<prime;k++) for(int i=0;i<hash1[k].size();i++) for(int j=i+1;j<hash1[k].size();j++) if(cmp(hash1[k][i],hash1[k][j])) return true; return false; } int main() { //fstream cin("C:\\Users\\wuyanyisb\\Desktop\\1.txt"); int n; scanf("%d",&n); //cin>>n; int sum=0; for(int i=0;i<n;i++) { sum=0; for(int j=0;j<6;j++) { scanf("%d",&arm[i][j]); //cin>>arm[i][j]; sum+=arm[i][j]; } hash1[sum%prime].push_back(i); } bool flag=check(); if(!flag) cout<<"No two snowflakes are alike."<<endl; else cout<<"Twin snowflakes found."<<endl; system("pause"); return 0; }