题意与分析
这题意思是这样的:在正方体的六面镶嵌给定颜色的宝石(相同颜色不区分),然后问最多有几种彼此不等价(即各种旋转过后看起来一致)的方案。
其实可以乱搞,因为范围只有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();
}
}