这道题是长沙区域赛的一道简单题,当时题目在ZOJ重现的时候就做了一次,但是做的好复杂,用的BFS暴力,而且还没打表,最后还是莫名其妙的爆栈错误,所以就一直没弄出来,昨天做到大白书上例题05年东京区域赛的一道类似题 Colored Cubes,这类题都需要脑补一下立方体的旋转总共有几种状态,然后用函数或者手工打表来记叙每一次变化之后的立方体变化

这道题从编号开始就给了我们很大便利,从0-23,读入数据也是按照这个来,很方便。我是手工打的表,说实话,魔方的转动还是有点复杂,我还真不知道用函数怎么打出表来。

吐血的是我一开始脑子居然觉得只有4种旋转方式,其实有6种,当然不考虑对应面的旋转,否则就有12种了,很好理解,魔方的一个面顺时针或者逆时针旋转,就相当于对应面的反向运动,因此6个面只需考虑三个面,由此打好表,然后用DFS进行下搜索即可。。。不得不说一下一旦用到DFS剪枝的重要性,由于魔方旋转过程中,可能出现转过去又转回来的情况,但其实是做了无用功,因此可以简单的判断一下是否又转了回来,这样子时间复杂度一下从1000+降到了300+。

#include <iostream>
#include <cstdio>
#include <cstring>
int clocks[][]={
{,,,,,,,,,,,,,
,,,,,,,,,,},
{,,,,,,,,,,,,,
,,,,,,,,,,},
{,,,,,,,,,,,,,
,,,,,,,,,,},
{,,,,,,,,,,,,,
,,,,,,,,,,},
{,,,,,,,,,,,,,
,,,,,,,,,,},
{,,,,,,,,,,,,,,
,,,,,,,,,},
};
int cuba[],n,ans;
int r[];
inline int max(int a,int b)
{
if (a>b) return a;
else return b;
}
int judge(int* t)
{
int flag,tot;
tot=;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
flag=t[];
if (flag!=t[]||flag!=t[]||flag!=t[])
tot--;
return tot;
}
void solve(int x)
{
int temp[],i,j;
memcpy(temp,cuba,sizeof (cuba));
for (i=;i<x;i++)
{
int tt[];
memcpy(tt,temp,sizeof (temp));
for (j=;j<;j++)
{
temp[j]=tt[clocks[r[i]][j]];
}
}
ans=max(ans,judge(temp));
}
void dfs(int x)
{
if (ans==) return;
solve(x);
if (x==n) return;
else
{
for (int i=;i<;i++)
{
if (x> && i==r[x-] && i==r[x-] && i==r[x-]) //这个和下面那句都是剪枝条件,尤其是下面那句剪枝效果明显,避免重复的搜索。
continue;
if (x> && (i^)==r[x-])
continue;
r[x]=i;
dfs(x+);
}
}
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i=;i<;i++)
scanf("%d",&cuba[i]);
ans=;
memset(r,,sizeof r);
dfs();
printf("%d\n",ans);
}
return ;
}

LA 6621 /ZOJ 3736 Pocket Cube 打表+暴力的更多相关文章

  1. 模拟 ZOJ 3736 Pocket Cube

    题目传送门 题意:魔方最多旋转n次,问最多能使多少面颜色相同 分析:6种状态(3种旋转方式*顺逆方向,其他对称的!),首先先打个表,然后很愉快的DFS.自己写的时候费劲脑汁,代码很长,还TLE了... ...

  2. 2013区域赛长沙赛区现场赛 K - Pocket Cube

    K - Pocket Cube Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  3. ZOJ 2477 Magic Cube(魔方)

    ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular gam ...

  4. Pocket Cube

    Pocket Cube http://acm.hdu.edu.cn/showproblem.php?pid=5983 Time Limit: 2000/1000 MS (Java/Others)    ...

  5. HDU 5292 Pocket Cube 结论题

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

  6. 【】【】Pocket Cube

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s) ...

  7. 【HDOJ】4801 Pocket Cube 的几种解法和优化

    1. 题目描述给定一个$2 \times 2 \times 2$的魔方,当某个面上的4个小块颜色均相同时,称这个面为complete.求对这个魔方进行$n \in [1,7]$次旋转(沿某个面顺时针或 ...

  8. ZOJ 3622 Magic Number 打表找规律

    A - Magic Number Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  9. POJ 1595 Prime Cuts (ZOJ 1312) 素数打表

    ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312 POJ:http://poj.org/problem?id=159 ...

随机推荐

  1. jQuery通过name获取值

    使用jQuery获取name="day"的input对象: 方法1 var dayObj=$('input[name="day"]'); for(int i=0 ...

  2. ssh: connect to host 120.79.26.164 port 22: Connection timed out报错问题

    要是使用阿里云服务器,出现这种错误,一般是端口没有打开.需要在阿里云控制台中设置端口后,即可使用ssh连接.

  3. 【转载】redis.windows.conf 参数说明

    1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/ru ...

  4. SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

    最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN ...

  5. 留学论文Results部分英文写作句型整理

    本文分享曼切斯特大学全校语言项目负责人约翰·莫莱博士(Dr John Morley)给出的与结果介绍相关的句型,小编为大家整理了一下一共分为了11类,看完之后觉得非常有用,这里分享给大家,各位留学小伙 ...

  6. java基础源码 (5)--reflect包-AccessibleObject类

    学习参考博客:https://blog.csdn.net/benjaminzhang666/article/details/9664585AccessibleObject类基本作用 1.将反射的对象标 ...

  7. ORACLE异库DBLink创建以及使用

    遇到一个问题,两张库数据需要同步,但是数据量很大,落地迁移时间成本太大,这个时候找到一种方法就是DBLink 使用场景说明: A转移数据到B,需要在B上面创建此DBLink,然后使用. 创建方法: - ...

  8. Linux下C程序的内存映像

    2.Linux下C程序的内存映像 2.1. 代码段.只读数据段(1)对应着程序中的代码(函数),代码段在Linux中又叫文本段(.text)(2)只读数据段就是在程序运行期间只能读不能写的数据,con ...

  9. C++编程学习(五) C++ 存储类

    一.auto 存储类 根据初始化表达式自动推断被声明的变量的类型. auto f=3.14; //double auto s("hello"); //const char* aut ...

  10. VScode 修改中文字体

    打开vscode ctrl+,打开设置 找到font,第一个是首选的英文字体,第二个是中文字体.