POJ3349 Snowflake Snow Snowflakes (JAVA)

时间:2023-03-08 22:15:54

首先声明代码并没有AC,内存超了

但我对此无能为力,有没有哪位大神好心教一下怎么写

哈希,然后比较花瓣数组,这些应该都没问题才对。。唉。。

贴MLE代码

import java.util.*;
public class POJ3349 { static int N = 1200007;
public static class HashNode{
int[] num=null;
HashNode next = null;
} // hashlist[i]存储hash值为i的链表
static HashNode[] hashlist = new HashNode[1200010]; // 计算hash值
static int hashValue(int[] num){
int sum = 0;
for(int i=0;i<num.length;i++){
sum += num[i];
}
return sum % N;
} // 比较两种雪花花瓣,每片花瓣都一样才算一样
static boolean cmp(int[] a,int[] b){
if(a.length != b.length)
return false;
int len = a.length;
for(int i=0;i<len;i++){
if(a[i] != b[i]){
return false;
}
}
return true;
} // 根据数组hash值插入hashlist
static void insertHash(int h,int[] num){
HashNode hn = new HashNode();
hn.num = new int[6];
for(int i=0;i<hn.num.length;i++){
hn.num[i]=num[i];
}
hn.next=hashlist[h];
hashlist[h]=hn;
} // 找得到返回真
// 找不到插入hashlist之后返回假
static boolean searchHash(int h,int[] num){
HashNode hn = hashlist[h];
while (hn != null){
if(cmp(hn.num,num)){
return true;
}
hn = hn.next;
}
insertHash(h,num);
return false;
} public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// 顺时针数组,放输入数组{0,1,2,3,4,5,0,1,2,3,4,5}位置上的元素
int[] clockwise = new int[12];
// 逆时针数组,放输入数组{5,4,3,2,1,0,5,4,3,2,1,0}位置上的元素
int[] anticlockwise = new int[12];
boolean twin = false;
// 输入数组
int[] num = new int[6];
// 枚举顺逆时针用的临时数组
int[] temp = new int[6];
while (n-- > 0){
for(int i=0;i<num.length;i++){
num[i]=sc.nextInt();
}
// 已经找到一样的就停止计算,让输入跑跑完
if(twin)
continue;
// 计算顺时针数组
for(int i=0;i<6;i++){
clockwise[i]=clockwise[i+6]=num[i];
}
// 计算逆时针数组
for(int i=0;i<6;i++){
anticlockwise[i]=anticlockwise[i+6]=num[5-i];
}
// 按所有顺逆时针顺序枚举雪花花瓣,看是否存在相同花瓣
int h = hashValue(num); for(int i=0;i<6;i++){
//枚举所有顺时针顺序
for(int j=0;j<6;j++){
temp[j]=clockwise[j+i];
}
if(searchHash(h,temp)){
twin=true;
break;
}
//枚举所有逆时针顺序
for(int j=0;j<6;j++){
temp[j]=anticlockwise[j+i];
}
if(searchHash(h,temp)){
twin=true;
break;
}
}
} if(twin){
System.out.println("Twin snowflakes found.");
}else {
System.out.println("No two snowflakes are alike.");
} } }