您的位置:首页 > 其它

Snowflake Snow Snowflakes POJ - 3349 hash(爆搜剪枝)

2018-02-25 10:53 411 查看
传送门题目大意: 每个雪花有六个枝,每个枝有一定的长度, 用六个整数表示一个雪花, 给n个雪花, 确定有没有两个相同的雪花。 雪花的六个数可能是顺时针的也可能是逆时针的。 (共有12种可能)。题目分析: 数据量比较大,hash一下, hash方法为:把六个数求和取模, 冲突处理:都放在同一个地方。其实我感觉更像是剪枝, 思想就是如果六个数的和不相等的话, 那么一定不是相同的雪花, 避免了多余的搜索。如果两个雪花求和相等才有可能是相同的雪花。 再求是否相等即可。代码:
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;
const int maxn = 100005;
const int pri = 90001;
int snow[maxn][6];
vector<int> H[90001];

bool judge(int a, int key)
{
int size = H[key].size();
int b;
for(int i=0; i<size; ++i)
{
b = H[key][i];
for(int j=0; j<6; ++j)
{
int k = 0;
while(snow[a][k] == snow[b][(k+j)%6] && k < 6) ++k;
if(k == 6) return true;
k = 0;
while(snow[a][k] == snow[b][(j-k+6)%6] && k < 6) ++k;
if(k == 6) return true;
}
}
return false;

}

int main()
{
int n;
while(~scanf("%d", &n))
{
for(int i=0; i<= pri; ++i) H[i].clear();
bool ok = true;
for(int i=0; i<n; ++i)
{
int key = 0;
for(int j=0; j<6; ++j)
{
scanf("%d", &snow[i][j]);
key = (key + snow[i][j]) % pri;
}
if(!ok) continue;
if(!judge(i, key))
H[key].push_back(i);
else ok = false;
}
if(ok) printf("No two snowflakes are alike.\n");
else printf("Twin snowflakes found.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: