题意:给定二阶魔方初始状态,问N(1 <= N <= 7)步旋转操作以内最多能使几个面相同。

dfs搜索+剪枝。

魔方的每个旋转操作即对应于一个置换操作。又因为相对运动,上层左旋一次和下层右旋一次等价,故可分为6类操作。上层顺、逆时针旋转,左层顺、逆时针旋转,前层顺、逆时针旋转。这样每次操作有6种选择。

剪枝一:考虑旋转操作一次后,第二次不应进行逆操作回到旋转前状态。实现的时候将每种操作分别置为0、 1, 2、 3, 4、 5,操作1^操作2 = 1则说明两操作互为逆操作。

剪枝二:当有6个面相同时就停止搜索。

剪枝三:每个操作最多连续操作2次。(下述代码未实现该剪枝)

 #include <bits/stdc++.h>
using namespace std;
int a[][], ans, n;
int turn[][] = {
{,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,}, {,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,}, {,,,,,,,,,,,,,,,,,,,,,,,},
{,,,,,,,,,,,,,,,,,,,,,,,},
};
void debug(int a[], int p, int t){
if(t == ) return ;
int b[];
for(int i = ; i < ; i++){
b[i] = a[ turn[p][i] ];
printf("%d ", b[i]);
}
puts(""); debug(b, p, t-);
}
void dfs(int d, int pre){
if(ans >= ||d > n) return ;
if(d) for(int j = ; j < ; j++)
a[d][j] = a[d-][ turn[pre][j] ];
int now = (a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][]) +
(a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][])+
(a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][])+
(a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][])+
(a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][])+
(a[d][] == a[d][]&&a[d][] == a[d][]&&a[d][] == a[d][]);
ans = max(ans, now);
for(int i = ; i < ; i++)
if( (i^pre) != ) dfs(d+, i);
}
int main(){
while(~scanf("%d", &n)){
for(int i = ; i < ; i++)
scanf("%d", &a[][i]);
ans = ;
dfs(, -);
cout<<ans<<endl;
}
return ;
}

HDU4801·二阶魔方的更多相关文章

  1. 算法笔记_233:二阶魔方旋转(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...

  2. Java实现二阶魔方旋转

    魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向: ...

  3. zznu-2183: 口袋魔方

    大致题意: 题目描述 口袋魔方又称为迷你魔方,通俗的来讲就是二阶魔方,只有八个角块的魔方,如图所示. 二阶魔方8个角块的位置均可进行任意互换(!种状态),如果以一个角块不动作为参考角块,其他7个 角块 ...

  4. Java实现第八届蓝桥杯魔方状态

    魔方状态 题目描述 二阶魔方就是只有2层的魔方,只由8个小块组成. 如图p1.png所示. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下: 前面:橙色 右面:绿色 上面:黄色 ...

  5. ACM/ICPC2016 青岛区域赛

    A(hdu5982).(模拟) 题意:输入n对数,将每对数相乘并相加 分析:模拟 B(hdu5983).(模拟) 题意:给你一个二阶魔方,问能否通过一次旋转使得给定魔方的每个面颜色相同 分析:模拟 C ...

  6. squee_spoon and his Cube VI(贪心,找不含一组字符串的最大长度+kmp)

    1818: squee_spoon and his Cube VI Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 77  Solved: 22Subm ...

  7. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  8. 42-2017蓝桥杯b java

    1.购物单    小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.    这不,XX大促销又来了!老板夫人开出了长长的购物单,都 ...

  9. HDU 5292 Pocket Cube 结论题

    Pocket Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5292 Description Pocket Cube is the 2×2× ...

随机推荐

  1. HDU 1890:Robotic Sort(Splay)

    http://acm.hdu.edu.cn/showproblem.php?pid=1890 题意:有一个无序序列,经过不断地翻转,使得最后的序列是一个升序的序列,而且如果相同数字要使在原本序列靠前的 ...

  2. php函数:PHP pathinfo() 函数

    pathinfo() 函数以数组的形式返回文件路径的信息. 语法 pathinfo(path,options) 参数 描述 path 必需.规定要检查的路径. process_sections 可选. ...

  3. C语言中使用静态函数的好处

    C语言中使用静态函数的好处: 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多. ???(对这个不是很理解)其实我觉得上面这种说法是错误的,它的主 ...

  4. 20150825 C# 调用带参数的存储过程 模板

    ////// exec proceudre2                        //System.Data.SqlClient.SqlConnection sqlcon = new Sys ...

  5. poj3372 Candy Distribution

    可以证明: f(k) = k *(k - 1)/ 2 (1 ≤ k ≤ n)是n的完全剩余系当且仅当n = 2 ^ t. http://poj.org/problem?id=3372

  6. Uva 1218 完美的服务

    题目链接:https://uva.onlinejudge.org/external/12/1218.pdf 题意: 一个网络,选出一些点做服务器,使满足一些条件,求服务器最少数量.条件是,每个计算机恰 ...

  7. react学习

    http://www.cnblogs.com/yunfeifei/ http://wiki.jikexueyuan.com/project/react-native/native-ui-compone ...

  8. 编译android源码官方教程(5)编译完之后刷机、编译fastboot

    Running Builds IN THIS DOCUMENT Building fastboot and adb Booting into fastboot mode Unlocking the b ...

  9. Java过滤器应用-对Ajax请求做Session失效判断

    过滤器常用来对Session过期做判断 Layout.js 1.为ajax请求添加标识 2.无论ajax请求成功与否,complete函数终会执行 // 全局Ajax设置, 用于session过期后的 ...

  10. 【MySQL】MySQL的find_in_set的使用例子

    > 参考的优秀文章 FIND_IN_SET(str,strlist) > 简单的例子 这个函数的功能是,在第二个参数中寻找第一个参数,并返回第一个参数所在的位置,不存在则返回0.其中,第二 ...