POJ3349 Snowflake Snow Snowflakes (JAVA)

首先声明代码并没有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.");
        }

    }

}

  

猜你喜欢

转载自www.cnblogs.com/StackNeverOverFlow/p/9662040.html
今日推荐