博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 3349 Snowflake Snow Snowflakes 哈希
阅读量:4681 次
发布时间:2019-06-09

本文共 3545 字,大约阅读时间需要 11 分钟。

用开散列的方式处理哈希,才开始的时候,在isok判断两个雪花是否行等时,我错认为只要找到一个相同的数字,然后顺时针逆时针寻找如果没能查找到就算是不想等了,两组数据可能有形同的数字不知一个,所以在这里贡献了好几次WA.笨啊。。。

例如数据:

2

1 2 3 2 4 5

2 4 5 1 2 3

应该是相同的。。。

挂链方式处理。。

View Code
#include 
#include
#include
#define maxn 177777 using namespace std; struct node {
int num; node *next; }*p[maxn],H[maxn]; int n,a[maxn][7],pos; bool isok(int x,int y) {
int i,j; for (i = 0; i < 6; ++i) {
if (a[x][i] == a[y][0]) {
for (j = 1; j < 6; ++j) {
if (a[x][(i + j)%6] != a[y][j]) {
break; } } if (j == 6) return true; for (j = 1; j < 6; ++j) {
if (a[x][(i - j + 6)%6] != a[y][j]) {
break; } } if (j == 6) return true; //break;//就是因为这个break让我贡献了好几次wa。。 } } return false; } int main() {
int i,j; bool flag; while (~scanf("%d",&n)) {
memset(p,0,sizeof(p)); pos = 0; node *it; flag = false; for (i =0 ; i < n; ++i) {
int sum = 0; for (j = 0; j < 6; ++j) {
scanf("%d",&a[i][j]); sum += a[i][j]; } if (!flag) {
int tmp = sum % maxn; // printf(">>%d\n",tmp); for (it = p[tmp]; it != NULL; it = it->next) {
if (isok(it->num,i)) {
flag = true; break; } } if (!flag) {
node *q; q = &H[pos++]; q->num = i; q->next = p[tmp]; p[tmp] = q; } } } if (!flag) {
printf("No two snowflakes are alike.\n"); } else {
printf("Twin snowflakes found.\n"); } } return 0; }

vector<int>处理

View Code
#include 
#include
#include
#include
#define maxn 100007 using namespace std; int a[maxn][10]; vector
hash[maxn]; bool isok(int x,int y) {
int i,j; for (i = 0; i < 6; ++i) {
if (a[x][i] == a[y][0]) {
for (j = 1; j < 6; ++j)//顺时针查看 {
if (a[x][(i + j)%6] != a[y][j]) {
break; } } if (j == 6) return true; for (j = 1; j < 6; ++j)//逆时针查看 {
if (a[x][(i - j + 6)%6] != a[y][j]) {
break; } } if (j == 6) return true; } } return false; } int main() {
int i,j,n; while (~scanf("%d",&n)) {
bool flag = false; for (i = 0; i < maxn; ++i) hash[i].clear(); for (i = 0; i < n; ++i) {
int sum = 0; for (j = 0; j < 6; ++j) {
scanf("%d",&a[i][j]); sum += a[i][j]; } if (!flag) {
int tmp = sum%99991;//哈希映射处理 for (j = 0; j < hash[tmp].size(); ++j) {
if (isok(hash[tmp][j],i))//查找是否有同构的 {
flag = true; break; } } if (!flag) {
hash[tmp].push_back(i); } } } if (flag) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; }

转载于:https://www.cnblogs.com/E-star/archive/2012/03/26/2418549.html

你可能感兴趣的文章
C# Windows - ListBox&CheckedListBox
查看>>
AES对上传文件解密并加密的实现(JAVA实现)
查看>>
ThreadLocal 正名
查看>>
AngularJS自定义指令详解(有分页插件代码)
查看>>
数据挖掘学习--数据仓库
查看>>
基于Eclipse的Hadoop应用开发环境配置
查看>>
howto:Vaadin开发环境部署 for Spring Roo - vaadin.com
查看>>
mariadb semi plugin遇到的坑
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
NABCD分析
查看>>
input实时监听
查看>>
Maven学习:常用mvn命令
查看>>
C#垃圾回收机制
查看>>
web项目部署到Tomcat服务器的三种方式
查看>>
P1962 斐波那契数列-题解(矩阵乘法扩展)
查看>>
Kibana6.x.x源码分析--Error: $injector:nomod Module Unavailable
查看>>
周围区域问题
查看>>
31、任务三十一——表单联动
查看>>
[ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
查看>>