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;
}
#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;
}
相关文章推荐
- POJ 3349 Snowflake Snow Snowflakes(哈希hash)
- POJ 3349 Snowflake Snow Snowflakes ( HASH+最小表示判同构 )
- poj 3349 Snowflake Snow Snowflakes(hash)
- poj 3349 Snowflake Snow Snowflakes(hash)
- POJ 3349 Snowflake Snow Snowflakes (hash 查找)
- POJ 3349 Snowflake Snow Snowflakes(hash表的使用)(环状问题的解决)
- POJ-3349-Snowflake Snow Snowflakes-hash
- POJ3349 Snowflake Snow Snowflakes(hash)
- POJ - 3349 Snowflake Snow Snowflakes (hash)
- poj 3349_Snowflake Snow Snowflakes_hash
- POJ 3349 Snowflake Snow Snowflakes(hash)
- POJ---3349-Snowflake Snow Snowflakes(hash)
- poj 3349 Snowflake Snow Snowflakes -----hash (vector)
- POJ 3349:Snowflake Snow Snowflakes(Hash)
- POJ 3349 SNOWFLAKE SNOW SNOWFLAKES(HASH)
- POJ 3349 Snowflake Snow Snowflakes(hash)
- POJ 3349 Snowflake Snow Snowflakes(hash哈希表)
- POJ-3349 Snowflake Snow Snowflakes【Hash】
- poj 3349 Snowflake Snow Snowflakes【HASH】/【最小表示】
- poj 3349 Snowflake Snow Snowflakes (hash)