poj 3349

题意:每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的。输入多个雪花,判断是否有形状一致的雪花存在。

简单的数字哈希,要注意的是每种雪花可以由多种数字组合表示。

比如输入的是1 2 3 4 5 6,

则2 3 4 5 6 1,3 4  5 6 1 2,……,6 5 4 3 2 1,5 4 3 2 1 6等都是相同形状的。

如果某次插入的时候发生冲突,则说明存在重复的雪花,并且后面的不需要再处理。

这题学到了大量数据要用BufferedReader,用Scanner会超时

Memory:  10896K

Time:  9985MS

import java.util.Scanner;
import java.util.Arrays;
import java.io.BufferedReader;
import java.io.InputStreamReader;


class Node{
        int lengths[] = new int[6];
        
        Node(int lengths[]){
            this.lengths = lengths;
            Arrays.sort(lengths);
        }
        public int get(int i){
            return lengths[i];
        }
    }

public class Main{
    static int n;
    
    static boolean same(Node x,Node y){
        for(int i=0;i<6;i++){
            if(x.get(i)!=y.get(i))
                return false;
        }
        return true;
    }
    
    public static void main(String[] args) throws Exception{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(bf.readLine());
        int flag = 0;
        Node nodes[][] = new Node[1500][100];
        int m[] = new int[1500];
        Arrays.fill(m,0);
        while(n!=0){
            n--;
            int sum=0;
            int temp[] = new int[6];
            String[] line = bf.readLine().split(" ");
            for(int i=0;i<6;i++){
                temp[i] = Integer.parseInt(line[i]);
                sum = (sum+temp[i])%1497;
            }
            if(flag == 0){
                Node node = new Node(temp);
                for(int j=0;j<m[sum];j++){
                    if(same(node,nodes[sum][j])){
                        flag = 1;
                        break;
                    }
                }
                nodes[sum][m[sum]] = node;
                m[sum]++;
            }
        }
        if(flag == 1)
            System.out.println("Twin snowflakes found.");
        else
            System.out.println("No two snowflakes are alike.");
        bf.close();
    }
}

后来想了想,对长度排序再依次比较是不对的,因为1 2 3 4 5 6和 1 3 2 4 5 6是不同的雪花,若是排序则相同,但上面代码还是ac了

下面是链表版,雪花的比较是按长度顺时针和逆时针依次比较

Memory: 10820K

Time: 12735MS

 1 import java.util.Arrays;
 2 import java.io.BufferedReader;
 3 import java.io.InputStreamReader;
 4 
 5 class Node{
 6     int index;
 7     Node next;
 8 }
 9 
10 public class Main{
11     static int nums[][];
12     static Node nodes[] = new Node[10000];
13     static int n;
14     
15     public static boolean findSame(int s1,int s2){
16         boolean flag;
17         int temp;
18         
19         for(int j=0;j<6;j++){
20             flag = true;
21             for(int step = 0;step<6;step++){
22                 if(nums[s1][(j+step)%6]!=nums[s2][step]){
23                     flag = false;
24                     break;
25                 }
26             }
27             if(flag)
28                 return true;
29         }
30         
31         for(int j=0;j<6;j++){
32             flag  = true;
33             for(int step=0;step<6;step++){
34                 temp = (j+6-step)%6;
35                 if(nums[s1][temp]!=nums[s2][step]){
36                     flag = false;
37                     break;
38                 }
39             }
40             if(flag)
41                 return true;
42         }
43         return false;
44     }
45     
46     public static void main(String[] args) throws Exception{
47         BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
48         n = Integer.parseInt(bf.readLine());
49         nums = new int[n][6];
50         boolean flag = false;
51         for(int i=0;i<n;i++){
52             int sum = 0;
53             String[] temp = bf.readLine().split(" ");
54             for(int j=0;j<6;j++){
55                 nums[i][j] = Integer.parseInt(temp[j]);
56                 sum = (sum+nums[i][j])%9997;
57             }
58             //System.out.println(Arrays.toString(nums[i]));
59             if(flag==false){
60                 Node node = new Node();
61                 if(nodes[sum]==null){
62                     node.index = i;
63                     node.next = null;
64                     nodes[sum] = node;
65                 }
66                 else{
67                     node.index = i;
68                     node.next = nodes[sum];
69                     nodes[sum] = node;
70                     for(Node p = nodes[sum];p!=null;p = p.next)
71                         for(Node q = p.next;q!=null;q = q.next){
72                             if(findSame(p.index,q.index)){
73                                 flag = true;
74                                 break;
75                             }
76                     }
77                 }
78             }
79         }
80         if(flag)
81             System.out.println("Twin snowflakes found.");
82         else
83             System.out.println("No two snowflakes are alike.");
84     }
85 }

 

posted @ 2015-05-09 22:26  杨永华  阅读(268)  评论(0编辑  收藏  举报