zoj 3726 Pocket Cube(搜索)
来源:互联网 发布:mac os sierra beta4 编辑:程序博客网 时间:2024/04/18 13:05
题意:有一个2×2×2的魔方,每一个小块上的颜色都不同,你现在最多能转魔方n次,m为魔方中一个面上的颜色全都相同的面的个数,问能转到的状态中m的最大值是多少。
思路:思路很简单,直接搜完所有状态,然后取个最大值就行了,但是写起来很烦,转啊转的都蒙了,gyf没事用纸做了个魔方给我看,按着这个魔方费了半天劲打了表……首先随便选一个面作为正面,那么对于当前状态来说一共有6种转法(怎么转的很容易能想出来),然后把转完以后哪个面对应哪个面算出来,打个表,剩下没什么难度,根据表直接搞就行了……
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<set>#include<stack>#include<cmath>#include<vector>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-9#define pi acos(-1.0)using namespace std;typedef long long ll;int n,ans;int now[30],b[30];int convert[6][24]={ {1,3,0,2,23,22,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,9,8}, {2,0,3,1,6,7,8,9,23,22,10,11,12,13,14,15,16,17,18,19,20,21,5,4}, {0,7,2,13,4,5,6,17,14,8,10,11,12,19,15,9,16,21,18,23,20,1,22,3}, {0,21,2,23,4,5,6,1,9,15,10,11,12,3,8,14,16,7,18,13,20,17,22,19}, {0,1,8,14,4,3,7,13,17,9,10,2,6,12,16,15,5,11,18,19,20,21,22,23}, {0,1,11,5,4,16,12,6,2,9,10,17,13,7,3,15,14,8,18,19,20,21,22,23}};int check(){ int rnt=0; bool flag=true; int color=now[0]; for(int i=0;i<4;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[16]; flag=true; for(int i=16;i<20;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[20]; flag=true; for(int i=20;i<24;++i) if(now[i]!=color) flag=false; if(flag) rnt++; color=now[4]; flag=true; for(int i=0;i<2;++i) if(now[4+i]!=color||now[4+i+6]!=color) flag=false; if(flag) rnt++; color=now[6]; flag=true; for(int i=0;i<2;++i) if(now[6+i]!=color||now[6+i+6]!=color) flag=false; if(flag) rnt++; color=now[8]; flag=true; for(int i=0;i<2;++i) if(now[8+i]!=color||now[8+i+6]!=color) flag=false; if(flag) rnt++; return rnt;}void rotate(int wh){ for(int i=0;i<24;++i) b[i]=now[convert[wh][i]]; for(int i=0;i<24;++i) now[i]=b[i];}void dfs(int step){ if(step==n) return ; for(int i=0;i<6;++i) { rotate(i); int tmp=check(); ans=max(ans,tmp); dfs(step+1); rotate(i^1); }}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(~scanf("%d",&n)) { for(int i=0;i<24;++i) scanf("%d",&now[i]); ans=check(); dfs(0); printf("%d\n",ans); } return 0;}
- zoj 3726 Pocket Cube(搜索)
- ZOJ 3736 Pocket Cube
- ZOJ 3736 Pocket Cube
- ZOJ 3736 & HDU 4801 - Pocket Cube 打表搜索
- [dfs] zoj 3736 Pocket Cube
- ZOJ 3736 Pocket Cube 脑补+BFS
- ZOJ 3736 Pocket Cube(暴力,魔方)
- ZOJ 3736——Pocket Cube
- Pocket Cube
- Pocket Cube
- hdu 4801 Pocket Cube 四面魔方,模拟+搜索
- hdu 4801 Pocket Cube
- HDU 5292 Pocket Cube
- hdu 5292 Pocket Cube
- hdu 5292 Pocket Cube
- hdu 5292 Pocket Cube
- HDU5983 Pocket Cube 【模拟】
- HDU 5292 Pocket Cube
- 用户/服务器进程概念及v$session/V$PROCESS视图简介
- 光流法简单介绍
- MediaPlayer_视频播放器
- WIN8系统如何分区
- STL string
- zoj 3726 Pocket Cube(搜索)
- assert() 宏用法
- 0.driverbase-WDM和NT驱动
- java学习02-java基础知识、基本数据类型、运算符
- [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
- ACE_Task介绍(生产者/消费者)v3.0
- Dijkstra算法的个人理解
- Qt实现监听功能
- PokerGame