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 }