2013山东省赛D题 upcoj 2220: Rubik’s cube(爆搜)
来源:互联网 发布:windows 关键问题 编辑:程序博客网 时间:2024/06/08 08:09
比赛的时候没时间做,没办法.昨天早上写了一下.今天交上去1A ,
最喜欢这样的搜索了,没难度.
思路:魔方的旋转方法总共有12种,
只考虑前面的四个正方形,上面向左旋转,跟下面向右旋转是一个效果,方法数可以除2..
向右旋转一次等于向左旋转两次,可以一起处理,方法数再减半.三种情况.代码很短.
只有两种颜色,很多重复状态.用map当hash页不会超时.100ms水过.比标程代码短时间少..
分享代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>#include <stack>#include <map>#include <string>#define LL long long#define DB double#define SF scanf#define PF printf#define N 1<<24#define bug cout<<"bug"<<endl;using namespace std;map<int,int> mp;struct nod{ int a[25]; int dis;};int cc[20][15]={ {0,1,4,5,20,21,12,13}, {8,11,10,9}, {18,16,2,0,9,10,21,23}, {13,12,14,15}, {4,6,17,16,15,13,9,8}, {0,1,3,2},};void turn(nod &t,int c){ c<<=1; int tmp = t.a[cc[c][7]]; for(int i=7;i>0;i--) { t.a[cc[c][i]]=t.a[cc[c][i-1]]; } t.a[cc[c][0]] = tmp; tmp = t.a[cc[c][7]]; for(int i=7;i>0;i--) { t.a[cc[c][i]]=t.a[cc[c][i-1]]; } t.a[cc[c][0]] = tmp; tmp = t.a[cc[c|1][3]]; for(int i=3;i>0;i--) { t.a[cc[c|1][i]]=t.a[cc[c|1][i-1]]; } t.a[cc[c|1][0]] = tmp;}nod in;queue<nod> que;int gethas(nod &t){ int ret = 0; for(int i=0;i<24;i++) { ret = t.a[i]+(ret<<1); }return ret;}bool ok(nod &t){ for(int i=0;i<24;i+=4) { for(int j=1;j<4;j++) if(t.a[i]!=t.a[i+j]) return false; }return true;}int solve(){ int con = 0; for(int i=0;i<24;i++) if(in.a[i]) con++; if(con%4) return -1; in.dis = 0; while(!que.empty()) que.pop(); que.push(in); mp.clear(); mp[gethas(in)] = 1; nod e,t; if(ok(in)) return t.dis; while(!que.empty()) { e = que.front();que.pop(); for(int i=0;i<3;i++) { t = e;t.dis++; turn(t,i); if(mp.find(gethas(t))==mp.end()) { mp[gethas(t)] = 1;//bug if(ok(t)) return t.dis; que.push(t); } turn(t,i); turn(t,i); if(mp.find(gethas(t))==mp.end()) { mp[gethas(t)] = 1;//bug if(ok(t)) return t.dis; que.push(t); } } }return -1;}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int cas;SF("%d",&cas); while(cas--) { for(int i=0;i<24;i++) SF("%d",&in.a[i]); int k = solve(); if(k==-1) printf("IMPOSSIBLE!\n"); else printf("%d\n",k); } return 0;}
- 2013山东省赛D题 upcoj 2220: Rubik’s cube(爆搜)
- 2013山东省赛Rubik’s cube 魔方BFS
- 第四届 山东省ACM Rubik’s cube(爆搜)
- HDU 4397 - Rubik's Cube
- HDU 4397 Rubik's Cube
- POJ 1955 Rubik's Cube
- Rubik's Cube Beijing Fall Open 2008
- Rubik's Cube Beijing Spring Open 2009
- POJ 1290 Grandpa's Rubik Cube 笔记
- Android OpenGL es 3D Rubik Cube 多纹理贴图
- Exploit writing tutorial part 10 : Chaining DEP with ROP – the Rubik’s[TM] Cube
- 欢庆魔术方块(Rubik's Cube)四十岁,Google 让你在 Doodle 上面玩! ...
- 2017 ACM山东省赛 D
- 山东省第三届省赛D题
- HEX SDUT 3896 17年山东省赛D题
- 2017山东省赛D题(SDUT3896逆元法求组合数)
- CERC 13A - Rubik’s Rectangle
- HEX 山东省第八届省赛D题
- 在DataGridView控件上实现列标头象Excel带数据筛选功能
- 好久没有写博客了
- 接口实现状态保存(三种方法)
- Excel为整列设置函数
- 给定你一个字符串,把字符串中每个字符按不同位置打印
- 2013山东省赛D题 upcoj 2220: Rubik’s cube(爆搜)
- 有用的工具类
- MySQL:如何编写UDF
- 语言栏和声音图标消失的解决方案
- 快速排序法(一)
- DOM21---调查问卷与性格测试的应用
- 上三角矩阵 A 的上三角元素已按行主序连续存放在数组 B 中,将 B 中元素按列主序连续存放至数组 C 中.
- Why do Windows functions all begin with a pointless MOV EDI, EDI instruction?
- 修炼功法错了,再怎么努力修炼效率还是很低!