HDU4801·二阶魔方
题意:给定二阶魔方初始状态,问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·二阶魔方的更多相关文章
- 算法笔记_233:二阶魔方旋转(Java)
目录 1 问题描述 2 解决方案 1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...
- Java实现二阶魔方旋转
魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下: x轴正向:绿 x轴反向:蓝 y轴正向:红 y轴反向:橙 z轴正向: ...
- zznu-2183: 口袋魔方
大致题意: 题目描述 口袋魔方又称为迷你魔方,通俗的来讲就是二阶魔方,只有八个角块的魔方,如图所示. 二阶魔方8个角块的位置均可进行任意互换(!种状态),如果以一个角块不动作为参考角块,其他7个 角块 ...
- Java实现第八届蓝桥杯魔方状态
魔方状态 题目描述 二阶魔方就是只有2层的魔方,只由8个小块组成. 如图p1.png所示. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下: 前面:橙色 右面:绿色 上面:黄色 ...
- ACM/ICPC2016 青岛区域赛
A(hdu5982).(模拟) 题意:输入n对数,将每对数相乘并相加 分析:模拟 B(hdu5983).(模拟) 题意:给你一个二阶魔方,问能否通过一次旋转使得给定魔方的每个面颜色相同 分析:模拟 C ...
- 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 ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 42-2017蓝桥杯b java
1.购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都 ...
- HDU 5292 Pocket Cube 结论题
Pocket Cube 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5292 Description Pocket Cube is the 2×2× ...
随机推荐
- WordPress博客系统搜索引擎优化seo全攻略方法
WordPress的文章.评论等很多数据都是存放在数据库的,所以搭建wordpress网站的时间,网站的空间不需要多大,而数据库一定要充足,而在WordPress数据库中主要使用 wp_posts 表 ...
- JavaEE基础(十九)/异常和File
1.异常(异常的概述和分类) A:异常的概述 异常就是Java程序在运行过程中出现的错误. B:异常的分类 通过API查看Throwable Error 服务器宕机,数据库崩溃等 Exception ...
- Discuz2 x3深入研究内容资料
http://blog.csdn.net/yanhui_wei/article/category/1136193
- 在ecshop顶部会员信息提示区显示会员等级
会员登陆后,在顶部会员信息提示区显示会员等级会员登陆后会在顶部出现这样的提示:您好,test2, 欢迎您回来 ! 进入用户中心 |退出现在设想在会员名后面加上“会员等级”效果如下:您好,test2, ...
- cocos2dx lua bug之module 'lsqlite3' not found
05-27 15:41:01.360: D/cocos2d-x debug info(7261): [LUA-print] -------------------------------------- ...
- Android 查看内存使用状况
再看开发过程中,经常要通过内存的使用量来优化程序. 查看应用程序的命令:adb shell procrank 显示如下: PID Vss Rss Pss Uss ...
- PIGS 分类: POJ 图论 2015-08-10 09:15 3人阅读 评论(0) 收藏
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18209 Accepted: 8277 Description Mir ...
- HDU(2485),最小割最大流
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2485 Destroying the bus stations Time Limit: 40 ...
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
- HDU(1856),裸的带权并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:朋友圈问题,A和B是朋友,B和C是朋友则A和C也是朋友,依次类推,题目的意思就是求最大的朋 ...