题目:一朵雪花有6个花瓣,每个花瓣有一个值,当两片雪花六个对应位置的花瓣都一样时,就是Twin Snowflakes。给出一个雪花的集合,要求查找里面是否有Twin Snowflakes。
思路:哈希的入门题目。如果直接数组存储比较会超时。建立一个哈希表,每读入一片雪花,就先排序,再存入哈希表,如果发现表中已经存储了一样的雪花,就判定为存在Twin Snowflakes,如果所有雪花都存入还没有存入相同的则判定为不存在。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
static Node nodes[];
static final int SIZE = 10000;
static boolean flag;
public static void main(String[] args) throws IOException {
nodes = new Node[SIZE];
initHead();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String input = in.readLine();
StringTokenizer st = new StringTokenizer(input);
int N = Integer.parseInt(st.nextToken());
for(int i = 0; i < N; i++){
int map[] = new int[6];
input = in.readLine();
st = new StringTokenizer(input);
for(int j = 0; j < 6; j++){
map[j] = Integer.parseInt(st.nextToken());
}
sort(map);
int key = getKey(map);
Node newNode = new Node();
newNode.value = map;
insert(key, newNode);
if(flag)
break;
}
if(!flag){
System.out.println("No two snowflakes are alike.");
}else{
System.out.println("Twin snowflakes found.");
}
in.close();
}
static void initHead(){
for(int i = 0; i < SIZE; i++){
nodes[i] = new Node();
nodes[i].next = nodes[i];
nodes[i].pre = nodes[i];
}
}
static void insert(int key, Node newNode){
Node cur = nodes[key].next;
while(cur != nodes[key]){
if(isSame(cur.value, newNode.value)){
flag = true;
return;
}
cur = cur.next;
}
newNode.pre = cur;
newNode.next = cur.next;
newNode.next.pre = newNode;
cur.next = newNode;
}
static boolean isSame(int a[], int b[]){
for(int i = 0; i < 6; i++){
if(a[i] != b[i])
return false;
}
return true;
}
static void sort(int a[]){
for(int i =0; i < 6; i++){
for(int j = i + 1; j < 6; j++){
if(a[i] > a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
static int getKey(int value[]){
int sum = 0;
for(int i = 0; i < 6; i++)
sum += value[i];
return sum % SIZE;
}
static class Node{
Node next;
Node pre;
int value[];
}
}