Rubik's Cube

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5836

Description

As we all know, Zhu is the wisest man. When Liao was ninety-nine years old, the Zhu appeared to him and said, "I am God Almighty; walk before me and be blameless.

I will confirm my covenant between me and you and will greatly increase your wisdom." At that time, Liao has a problem:

Liao has a Rubik's Cube and the surfaces of it are drawn as black or white. He can rotate it as the rules of the Rubik's Cube. Liao asked Zhu:"how many states the Rubik's Cube can reach?"

Zhu is omniscient and omnipotent, but he did not tell the answer. Can you tell the poor man the answer? Remember two states are regarded as the same one if you change views and find the two states is the same one.

For those of you unfamiliar with the puzzle, a Rubik's Cube, comes in the form of a cube where each face is divided into three rows and three columns (nine "squares". Any of the six faces of the cube may be rotated either clockwise or counterclockwise, which also rotates the three nearest squares on each adjoining face onto a new face, respectively.

Input

Intput contains multiple test cases.

The first line is an integer 1≤T≤10, the number of test cases.

Each case begins with an integer n, indicating the number of the squares of blacks.

The next line contains n integers a1,a2,..,an, representing squares indexed as a1,a2,..,an are black respectively. All ai are defferent. The indexes of squares are showed in the pictures. (0≤n≤5,0≤ai≤53).

Output

For each test case,output a single line "Case #x: y", where x is the case number, starting from 1. And y is the answer.

Sample Input

3

2

0 47

2

24 53

2

36 46

Sample Output

Case #1: 15

Case #2: 15

Case #3: 24

Hint

题意

给你一个魔方,告诉你这个魔方有一些格子是黑色的,问你这个魔方旋转之后能够得到多少个不同的魔方。

就是不同的要,完全不同。

就旋转相同,也算相同。

题解:

XJB搜,你需要买一个魔方,然后XJB转一下 ,看看转移是什么样的,当然你有强大的脑补能力也可以……

然后就完了……

代码

//by Atlantis67
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int f[4][54]={
{2,5,8,1,4,7,0,3,6,
36,37,38,12,13,14,15,16,17,
9,10,11,21,22,23,24,25,26,
18,19,20,30,31,32,33,34,35,
27,28,29,39,40,41,42,43,44,
45,46,47,48,49,50,51,52,53}, {6,3,0,7,4,1,8,5,2,
18,19,20,21,22,23,24,25,26,
27,28,29,30,31,32,33,34,35,
36,37,38,39,40,41,42,43,44,
9,10,11,12,13,14,15,16,17,
47,50,53,46,49,52,45,48,51}, {29,32,35,28,31,34,27,30,33,
2,5,8,1,4,7,0,3,6,
20,23,26,19,22,25,18,21,24,
47,50,53,46,49,52,45,48,51,
42,39,36,43,40,37,44,41,38,
11,14,17,10,13,16,9,12,15}, {18,19,20,21,22,23,24,25,26,
11,14,17,10,13,16,9,12,15,
45,46,47,48,49,50,51,52,53,
33,30,27,34,31,28,35,32,29,
8,7,6,5,4,3,2,1,0,
44,43,42,41,40,39,38,37,36}
}; set<LL> s;
LL duilie[10000000];
int tot=0;
void pri(LL a,LL b,int ha)
{
printf("================\n");
for (int j=0;j<54;j++) if ((a>>j)&1) printf("%d ",j);puts("");
for (int j=0;j<54;j++) if ((b>>j)&1) printf("%d ",j);puts("");
printf("%d\n",ha);
getchar();
}
void BFS(LL first)
{
int fron=0,rear=1;
duilie[0]=first;
s.insert(first);
while (fron<rear){
LL now=duilie[fron];
for (int k=0;k<4;k++){
LL next=0;
for (int j=0;j<54;j++) {
if ((now>>j)&1)
next|=(1LL<<f[k][j]);
}
if (s.find(next)==s.end()) {
//pri(now,next,k);
duilie[rear++]=next;
s.insert(next);
}
}
fron++;
}
tot=rear;
}
LL w[100];
set<LL> si;
int wtot;
void gao(LL first)
{
si.clear();wtot=0;
int fron=0,rear=1;
w[0]=first;
si.insert(first);
while (fron<rear){
LL now=w[fron];
for (int k=1;k<4;k++){
LL next=0;
for (int j=0;j<54;j++) {
if ((now>>j)&1)
next|=(1LL<<f[k][j]);
}
if (si.find(next)==si.end()) {
w[rear++]=next;
si.insert(next);
}
}
fron++;
}
wtot=rear;
}
int suan()
{
int ans=0;
for (int j=0;j<tot;j++){
if (s.find(duilie[j])!=s.end()){
gao(duilie[j]);
for (int k=0;k<wtot;k++) s.erase(w[k]);
assert(24%wtot==0);
ans++;
}
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
int t=T;
while (T--){
int n;
scanf("%d",&n);
LL first=0;
for (int j=0;j<n;j++){
int g;
scanf("%d",&g);
first|=(1LL<<g);
}
//cout<<first<<endl;
s.clear();tot=0;
BFS(first);
printf("Case #%d: %d\n",t-T,suan());
}
return 0;
}

HDU 5836 Rubik's Cube BFS的更多相关文章

  1. hdu 3309 Roll The Cube ( bfs )

    Roll The Cube Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. sdutoj 2606 Rubik’s cube

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2606 Rubik’s cube Time Li ...

  3. HDU 2717 Catch That Cow --- BFS

    HDU 2717 题目大意:在x坐标上,农夫在n,牛在k.农夫每次可以移动到n-1, n+1, n*2的点.求最少到达k的步数. 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先 ...

  4. POJ 1955 Rubik's Cube

    暴力模拟就好了.... vim写代码真费事,手都写酸了... Rubik's Cube Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  5. The Mathematics of the Rubik’s Cube

    https://web.mit.edu/sp.268/www/rubik.pdf Introduction to Group Theory and Permutation Puzzles March ...

  6. HDU 5876 关于补图的bfs

    1.HDU 5876  Sparse Graph 2.总结:好题,把STL都过了一遍 题意:n个点组成的完全图,删去m条边,求点s到其余n-1个点的最短距离. 思路:把点分为两个集合,A为所有没有到达 ...

  7. hdu 1240:Asteroids!(三维BFS搜索)

    Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  8. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  9. HDU 3085 Nightmare II 双向bfs 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...

随机推荐

  1. Lua程序设计(二)面向对象概念介绍

    ----------------------------------------------------------- Lua面向对象3 local smartMan = { name = " ...

  2. jdk1.8.0_45源码解读——HashSet的实现

    jdk1.8.0_45源码解读——HashSet的实现 一.HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.主要具有以下的特点: 不保证set的迭代顺 ...

  3. Flex 经验笔记二

    向 Module 传递数据:好像只能传递些像 整型,字符型等简单类型的数据,也能传递像 json 这样的 Object 对象,但如果 Object 对象是从层的,其子级数据,好像也读取不到. func ...

  4. 第9月第7天 uicollectionview

    1. /** The margins used to lay out content in the section controller. @see `-[UICollectionViewFlowLa ...

  5. Django用ajax进行post请求

    post请求有两种,跨域和不跨域 1.不跨域 # 不跨域的 view.py def re_json(request): print(request.POST['name']) p1 = Product ...

  6. 概率dp(A - Scout YYF I POJ - 3744 )

    题目链接:https://cn.vjudge.net/contest/276241#problem/A 题目大意:首先输入n和p,n代表地雷的个数,p代表走一步的概率,1-p代表走两步的概率,然后问你 ...

  7. Flask源码解析:Flask应用执行流程及原理

    WSGI WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述服务器端如何与web应用程序通信的 ...

  8. poj1093

    题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式.设每个空格长度为n,单个空格的badness计算公式为(n-1)^2.总badness等于所有空格的bad ...

  9. idea如何导入一个maven项目

    1.import project 2.选择maven项目 3.选择第二个external moudle,选择maven, 4.点击next,一次点击1,2,3,4 5.设置maven环境 6.点击ok ...

  10. 探秘Java类加载

    Java是一门面向对象的编程语言. 面向对象以抽象为基础,有封装.继承.多态三大特性. 宇宙万物,经过抽象,均可归入相应的种类.不同种类之间,有着相对井然的分别. Java中的类,便是基于现实世界中的 ...