【日常训练】Help Victoria the Wise(Codeforces 99C)

题意与分析

这题意思是这样的:在正方体的六面镶嵌给定颜色的宝石(相同颜色不区分),然后问最多有几种彼此不等价(即各种旋转过后看起来一致)的方案。
其实可以乱搞,因为范围只有720。求出全排列,然后每个旋转很多次,看看彼此可不可能相同,很多次旋转后都相同说明稳了,然后最后统计即可。
这题相当有意思的是复习了全排列的求法,竟然不能一下子想到- -|||
下面还会说下Java里面String与StringBuilder相关的内容:(待补)

代码

/*
 * ACM Code => cfr99c.java
 * Written by Sam X
 * Date: 三月, 19, 2019
 * Time: 11:08
 */
import java.util.*;
import java.math.*;

public class cf99c
{
    static TreeSet<String> ts = new TreeSet<>();
    static HashSet<String> hs = new HashSet<>();
    static void Permutation(String obj, String str, int obj_len)
    {
        if(obj.length()==obj_len)
            ts.add(obj);
        else for(int i=0;i!=str.length();++i)
            Permutation(obj+str.charAt(i), str.substring(0, i)+str.substring(i+1, str.length()), obj_len);
    }
    public static void main(String args[])
    {
        Scanner cin = new Scanner(System.in);
        String str = cin.next();
        Permutation("", str, str.length());
        int ans=0;
        for(String s:ts) 
            if(judge(s)) 
            {
                hs.add(s); ans++;
            }
        System.out.println(ans);
        cin.close();
    }

    // 乱搞,启动!
    static int maxJudge=114514;
    static boolean judge(String str)
    {
        for(int i=1;i<=maxJudge;++i)
        {
            if(Math.random()<0.5) str=rotateUp(str);
            else str=rotateLeft(str);
            if(hs.contains(str)) 
                return false;
        }
        return true;
    }

    static String rotateLeft(String str)
    {
        StringBuilder sb = new StringBuilder();
        sb.append(str.charAt(0));
        sb.append(str.charAt(2));
        sb.append(str.charAt(3));
        sb.append(str.charAt(4));
        sb.append(str.charAt(1));
        sb.append(str.charAt(5));
        return sb.toString();
    }

    static String rotateUp(String str)
    {
        StringBuilder sb = new StringBuilder();
        sb.append(str.charAt(1));
        sb.append(str.charAt(5));
        sb.append(str.charAt(2));
        sb.append(str.charAt(0));
        sb.append(str.charAt(4));
        sb.append(str.charAt(3));
        return sb.toString();
    }
}
posted @ 2019-03-20 15:43  SamHX  阅读(153)  评论(0编辑  收藏