HDU1430 魔板 康托展开
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
第一道康拓展开题,由于魔板的第二行,由于是逆向的,所以我处理的时候将其看做是摆正的
也就是
1234
8765
而我处理的时候是
1234
5678
康拓展开的原理考研看这里:http://blog.csdn.net/zhongkeli/article/details/6966805
知道了原理之后,就不难解决了
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;string start,end,ans[50000];int hash[10],pos[10],vis[50000];struct node{ string step,str; int val;};int solve(string &s){ int i,j,sum = 0; for(i = 0; i<7; i++) { int cnt = 0; for(j = i+1; j<8; j++) if(s[i]>s[j]) cnt++; sum+=cnt*hash[7-i]; } return sum;}void fun_A(string &s){ for(int i = 0; i<4; i++) swap(s[i],s[i+4]);}void fun_B(string &s){ char t=s[3]; for(int i=2; i>=0; i--) s[i+1]=s[i]; s[0]=t; t=s[7]; for(int i=6; i>=4; i--) s[i+1]=s[i]; s[4]=t;}void fun_C(string &s){ char t=s[1]; s[1]=s[5]; s[5]=s[6]; s[6]=s[2]; s[2]=t;}void bfs(){ memset(vis,0,sizeof(vis)); node a,next; queue<node> Q; a.step = ""; a.str = start; a.val = solve(start); vis[a.val] = 1; ans[a.val] = ""; Q.push(a); while(!Q.empty()) { a = Q.front(); Q.pop(); string t; int k; t = a.str; fun_A(t); k = solve(t); while(!vis[k]) { vis[k] = 1; next = a; next.step+='A'; ans[k] = next.step; next.str = t; next.val = k; Q.push(next); } t = a.str; fun_B(t); k = solve(t); while(!vis[k]) { vis[k] = 1; next = a; next.step+='B'; ans[k] = next.step; next.str = t; next.val = k; Q.push(next); } t = a.str; fun_C(t); k = solve(t); while(!vis[k]) { vis[k] = 1; next = a; next.step+='C'; ans[k] = next.step; next.str = t; next.val = k; Q.push(next); } }}int main(){ int i,j; hash[0] = 1; for(i = 1; i<10; i++) hash[i] = hash[i-1]*i; start = "12345678"; bfs(); while(cin>>start>>end) { swap(start[4],start[7]);//把魔板板变为我所处理的状况 swap(start[6],start[5]); swap(end[4],end[7]); swap(end[6],end[5]); for(i = 0; i<8; i++) pos[start[i]-'0'] = i+1; for(i = 0; i<8; i++) end[i] = pos[end[i]-'0']; int k; k = solve(end); cout << ans[k] << endl; } return 0;}
HDU1430 魔板 康托展开相关推荐
- HDU1430,魔板
书上的推荐例题,在双向广搜里面.刚开始尝试用双向广搜,但是一直wa,看网上讨论才知道所得到的答案不一定是最小的字典序.此题比较纠结的是标记,普通做要开8维数组,但是如果用cantor展开之后,每一种状 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu.1430.魔板(bfs + 康托展开)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 康托展开(hdu1430)
在魔方风靡全球之后不久,Rubik先生发明了它的简化版--魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始 ...
- 【题解】Luogu P2730 魔板
蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...
- [总结] 康托展开及其逆运算
这里先贴一道例题 我们先科普一下康托展开 定义: X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! ai为整数,并且0<=ai<i ...
- 康托展开及其逆运算 详解
前文: 这个东东是我准备进攻一道A*算法的八数码题目时,遇到的. 决定先搞懂这个,再进攻八数码(传说中 不做人生不完整的 题目). 康托展开是什么? 定义: X=an*(n-1)!+an-1*(n- ...
- 关于康托展开的用途及写法
在处理八数码这一类需要用到全排列的问题的时候, 存储往往是一个难题, 因为明明只有n!种情况, 数字的长度却有n, 用数组是肯定不行的. 这个时候, 康托展开就派上了用场, 当然, 在条件允许的情况下 ...
- P2730 魔板 Magic Squares
不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...
最新文章
- 784.字母大小写全排列
- 【Nginx入门系列】第六章 Nginx+tomcat集群负载均衡部署
- 时间序列预测——线性回归(上下界、异常检测),异常检测时候历史数据的输入选择是关键,使用过去历史值增加模型健壮性...
- 《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.5 大数据系统应有的属性...
- MyBatis-学习笔记12【12.Mybatis注解开发】
- [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)
- gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号
- 欧菲光修正2020年业绩为预计亏损18.5亿元
- PHP linux spl_autoload_register区分大小写
- 好程序员web前端教程:字符串
- 洛谷P1156 垃圾陷阱【线性dp】
- final修饰的对象咋办?
- 银耳椰椰——Alpha冲刺Day01
- RocketMQ 内存优化
- 软件工程毕业设计课题(80)微信小程序毕业设计PHP电影视频播放小程序系统设计与实现
- YOLO模型train.py文件报错:size mismatch for last_layer0.6.weight: copying a param with shape torch.
- JAVA读取Excel表格,建数据库建表,并生成java实体实例
- c语言编程设计实验课件,c语言程序设计实验课件.ppt
- html蓝色粒子,HTML5 粒子编辑器
- 裸辞后进入华为,拿下34K测试岗offer....
热门文章
- Error:(7, 21) java: 程序包javax.servlet不存在
- 《新白发魔女传》之自创歌曲 《绝缘》
- python 提取视频中的音频 | Python工具类
- mysql udb_UDB高可用数据库内核深度优化
- linux虚拟光驱路径,Linux操作系统下虚拟光驱(iso)的挂载
- e站app里站hosts_“科普e站”启用 让科学触手可及
- 安搭Share:主播探店为实体店发展迎来新机遇
- css3音乐播放器,CSS3-自定义视频与音乐播放器!
- python初始化二维矩阵
- linux中文件权限 组,linux中文件权限格式与chmod命令以及用户和用户组的管理