题目

HDU 4801

给出一个两阶魔方的初始形态,一次可以将一个面转动90°
求在N(1<=N<=7)步内最多能拼成几个面。

题解

由于是两阶魔方,左边UP等于右边DOWN,因此共有6种转动方式。直接模拟即可,时间复杂度O(67×12)O(6^7\times 12)O(67×12)

代码

#include <bits/stdc++.h>
using namespace std;int mp[][6] = {//魔方展开图{-1, -1, 0, 1, -1, -1},{-1, -1, 2, 3, -1, -1},{4, 5, 6, 7, 8, 9},{10, 11, 12, 13, 14, 15},{-1, -1, 16, 17, -1, -1},{-1, -1, 18, 19, -1, -1},{-1, -1, 20, 21, -1, -1},{-1, -1, 22, 23, -1, -1},
};
pair<int, int> rev[30];void init() //魔方位置-展开图坐标的映射
{rev[0] = {0, 2};rev[1] = {0, 3};rev[2] = {1, 2};rev[3] = {1, 3};rev[4] = {2, 0};rev[5] = {2, 1};rev[6] = {2, 2};rev[7] = {2, 3};rev[8] = {2, 4};rev[9] = {2, 5};rev[10] = {3, 0};rev[11] = {3, 1};rev[12] = {3, 2};rev[13] = {3, 3};rev[14] = {3, 4};rev[15] = {3, 5};rev[16] = {4, 2};rev[17] = {4, 3};rev[18] = {5, 2};rev[19] = {5, 3};rev[20] = {6, 2};rev[21] = {6, 3};rev[22] = {7, 2};rev[23] = {7, 3};
}int get(int i) //取出这个位置的值
{return mp[rev[i].first][rev[i].second];
}void assign(int val, int pos) //把值val赋值给后者
{mp[rev[pos].first][rev[pos].second] = val;
}int n, ans;bool cmp(int id1, int id2)
{return get(id1) == get(id2);
}void fuck()
{int res = 0;res += cmp(0, 1) && cmp(1, 2) && cmp(2, 3);res += cmp(6, 7) && cmp(12, 13) && cmp(13, 7);res += cmp(8, 9) && cmp(14, 15) && cmp(8, 14);res += cmp(20, 21) && cmp(21, 22) && cmp(20, 23);res += cmp(4, 5) && cmp(4, 10) && cmp(4, 11);res += cmp(16, 17) && cmp(17, 18) && cmp(18, 19);ans = max(ans, res);
}void op1()
{int tmp = get(15);assign(get(9), 15);assign(get(8), 9);assign(get(14), 8);assign(tmp, 14);int tmp1 = get(23), tmp2 = get(21);assign(get(1), 21);assign(get(3), 23);assign(get(7), 1);assign(get(13), 3);assign(get(17), 7);assign(get(19), 13);assign(tmp1, 19);assign(tmp2, 17);
}
void op2()
{int tmp = get(15);assign(get(14), 15);assign(get(8), 14);assign(get(9), 8);assign(tmp, 9);int tmp1 = get(23), tmp2 = get(21);assign(get(19), 23);assign(get(17), 21);assign(get(13), 19);assign(get(7), 17);assign(get(3), 13);assign(get(1), 7);assign(tmp1, 3);assign(tmp2, 1);
}
void op3()
{int tmp = get(0);assign(get(2), 0);assign(get(3), 2);assign(get(1), 3);assign(tmp, 1);int tmp1 = get(4), tmp2 = get(5);assign(get(6), 4);assign(get(7), 5);assign(get(8), 6);assign(get(9), 7);assign(get(23), 8);assign(get(22), 9);assign(tmp1, 23);assign(tmp2, 22);
}
void op4()
{int tmp = get(0);assign(get(1), 0);assign(get(3), 1);assign(get(2), 3);assign(tmp, 2);int tmp1 = get(22), tmp2 = get(23);assign(get(8), 23);assign(get(9), 22);assign(get(6), 8);assign(get(7), 9);assign(get(4), 6);assign(get(5), 7);assign(tmp1, 5);assign(tmp2, 4);
}
void op5()
{int tmp = get(22);assign(get(23), 22);assign(get(21), 23);assign(get(20), 21);assign(tmp, 20);int tmp1 = get(4), tmp2 = get(10);assign(get(1), 4);assign(get(0), 10);assign(get(15), 1);assign(get(9), 0);assign(get(18), 15);assign(get(19), 9);assign(tmp1, 18);assign(tmp2, 19);
}
void op6()
{int tmp = get(22);assign(get(20), 22);assign(get(21), 20);assign(get(23), 21);assign(tmp, 23);int tmp1 = get(4), tmp2 = get(10);assign(get(18), 4);assign(get(19), 10);assign(get(15), 18);assign(get(9), 19);assign(get(1), 15);assign(get(0), 9);assign(tmp1, 1);assign(tmp2, 0);
}void dfs(int step)
{fuck();if (step >= n)return;op1();dfs(step + 1);op2();op2();dfs(step + 1);op1();op3();dfs(step + 1);op4();op4();dfs(step + 1);op3();op5();dfs(step + 1);op6();op6();dfs(step + 1);op5();
}void input()
{for (int i = 0; i <= 1; i++)for (int j = 2; j <= 3; j++)scanf("%d", &mp[i][j]);for (int i = 2; i <= 3; i++)for (int j = 0; j <= 5; j++)scanf("%d", &mp[i][j]);for (int i = 4; i <= 7; i++)for (int j = 2; j <= 3; j++)scanf("%d", &mp[i][j]);
}
void solve()
{while (~scanf("%d", &n)){ans = 0;input();dfs(0);printf("%d\n", ans);}
}int main()
{init();solve();return 0;
}

HDU4801 转魔方、DFS模拟相关推荐

  1. 736. Lisp 语法解析 : DFS 模拟题

    题目描述 这是 LeetCode 上的 736. Lisp 语法解析 ,难度为 困难. Tag : 「DFS」.「模拟」.「哈希表」 给你一个类似 Lisp 语句的字符串表达式 expression, ...

  2. 历届试题 核桃的数量(3个数的最小公倍数),翻硬币(贪心),买不到的数目(在范围内暴力,找范围,最小公倍数是上界,最小的数是下界),兰顿蚂蚁(dfs,模拟)

    历届试题 核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能 ...

  3. 蓝桥杯 二阶魔方旋转 模拟

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

  4. hdu 1298 字典树 + DFS (模拟T9文本输入)

    题意:       给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...

  5. UVALive 6884 GREAT + SWERC = PORTO dfs模拟

    题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  6. HDU 5250 三阶魔方(模拟、置换)

    题意: 给定N≤100的三阶魔方操作序列给定N\le100的三阶魔方操作序列 魔方操作如下图:魔方操作如下图: 求问:对一个初状态(六个面都是拼好的)的魔方进行多少次连续的序列操作后,魔方会恢复到初状 ...

  7. 翻转棋 dfs+模拟

    题目描述 农夫约翰知道,聪明的奶牛可以产更多的牛奶.他为奶牛设计了一种智力游戏,名叫翻转棋.翻转棋可以分成M × N (1 ≤ M, N ≤ 15)个格子,每个格子有两种颜色,一面是黑的,一面是白的. ...

  8. URAL 2013 Neither shaken nor stirred dfs 模拟

    题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该 ...

  9. [dfs][模拟网络流] Luogu P4189 星际旅行

    题目描述 公元30003000年,地球联盟已经攻占了银河系内的NN个星球,出于资金的考虑,政府仅仅在星球间建立了N-1N−1条双向时空隧道保证任意两个星球之间互相可达.出于管理上的考虑,第ii个星球的 ...

最新文章

  1. 安装NodeJS环境报错
  2. 如何衡量机器与人类的智能关系,AI智商评测标准专家研讨会邀请
  3. unity3d-游戏实战突出重围,第四天 添加角色
  4. jdbc mysql 自动重连_Mysql中JDBC如何完成自动重连机制的案例
  5. python九九乘法口诀表-python打出九九乘法口诀表
  6. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...
  7. stm32之GPIO
  8. SQL语句求解同一人物不同日期,某一属性的差值
  9. python中的断点是什么_python中简单的递归(断点报错的小福利)
  10. 蓝桥杯java a组_蓝桥杯十一届JavaA组-C++解题
  11. C++_选择结构_单行if语句_多行if语句_多条件if语句_嵌套if语句_三目运算符---C++语言工作笔记016
  12. JAVA正则提取字符串中的日期
  13. 流行的JavaScript库 ——jQuery
  14. CMMI3认证升级CMMI5认证需满足的基本条件
  15. 打印机乱码解决方案(未验证)
  16. Goldendict 及其词典详述
  17. NLP是什么,百度的NLP技术有有哪些?
  18. 蓝桥杯 STEMA 考试选择题模拟题
  19. Python入门习题大全——数字 8
  20. 基于UWB与航迹推算的智能仓储机器人

热门文章

  1. Nginx性能调优,解决C10K问题
  2. SOC RTC时钟——为什么实时时钟的晶振都是32.768KHZ呢?
  3. Windows10 移动热点无法正常开启
  4. 鸿蒙os系统测试版照片,鸿蒙OS正式发布:荣耀智慧屏首发,一起来体验鸿蒙OS吧...
  5. mysql 1265警告
  6. 如何确定IP在同一网段
  7. Tomcat优化方案
  8. 【CANopen】CANopen总线讲解
  9. 数据库------MYSQL
  10. 用于电子书的RSS——OPDS