[HDU 1430] 魔板
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1988 Accepted Submission(s): 407
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> #include <string> using namespace std; #define N 326888bool vis[N]; string way[N]; int fac[]={1,1,2,6,24,120,720,5040,40320,326880};struct node {string s;string op; };int Find(string &s) {int i,j,res=0;bool has[10]={0};for(i=0;i<9;i++){int x=s[i]-'0',y=0;for(j=1;j<x;j++){if(!has[j]) y++;}res+=y*fac[8-i];has[x]=1;}return res+1; }void bfs() {int i,j;node now,next;queue<node> q;memset(vis,0,sizeof(vis));now.s="12345678";now.op="";q.push(now);vis[Find(now.s)]=1;while(!q.empty()){now=q.front();q.pop();way[Find(now.s)]=now.op;for(int i=1;i<=3;i++){next=now;if(i==1){next.op+='A';swap(next.s[0],next.s[7]);swap(next.s[1],next.s[6]);swap(next.s[2],next.s[5]);swap(next.s[3],next.s[4]);}else if(i==2){next.op+='B';char ch=next.s[3];for(j=3;j>=1;j--) next.s[j]=next.s[j-1];next.s[0]=ch;ch=next.s[4];for(j=4;j<7;j++) next.s[j]=next.s[j+1];next.s[7]=ch;}else{next.op+='C';char ch=next.s[1];next.s[1]=next.s[6];next.s[6]=next.s[5];next.s[5]=next.s[2];next.s[2]=ch;}if(!vis[Find(next.s)]){vis[Find(next.s)]=1;q.push(next);}}} } int main() {bfs();string s1,s2;while(cin>>s1>>s2){map<char,char> mp;for(int i=0;i<8;i++) //好吧、这儿写反了,WA- - {mp[s1[i]]=i+1+'0';}for(int i=0;i<8;i++){s2[i]=mp[s2[i]];}cout<<way[Find(s2)]<<endl;}return 0; }
转载于:https://www.cnblogs.com/hate13/p/4198053.html
[HDU 1430] 魔板相关推荐
- 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 ...
- hdu 1430 魔板
刚开始不知道有康托展开,一筹莫展,查了一下大神题解.看到说要用康托展开,遂跑去学. 康托展开:http://blog.csdn.net/zhongkeli/article/details/696680 ...
- hdu 1430+hdu 3567(预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状 ...
- java51游戏_Java作业实践(一)魔板游戏
课题:魔板游戏 一.课设要求 1.基本功能 (1)游戏规则 一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断 ...
- P2730 魔板 Magic Squares
不看题解肯定不会系列... 这道题可以用Cantor展开解决. Cantor展开可以求出一个数组是在全排列中的第几个. 具体怎么操作自己百度. Cantor展开的公式是:\(a[1] * (n - 1 ...
- 【题解】Luogu P2730 魔板
蒟蒻的第一道蓝题--好像也没有蓝的程度 一篇无STL的超弱题解(入门写法无误了QAQ 传送门 很经典的一道BFS 这是初始状态. 操作A 操作B 操作C 思路1 不使用cantor展开的情况 1. 对 ...
- 洛谷P2730 [IOI]魔板 Magic Squares
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- Magic Squares 魔板 (BFS+HASH)
Description 在成功地发明了魔方之后,拉比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8 ...
- 魔板(洛谷-P2730)
题目描述 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个 ...
最新文章
- C#中throw抛出异常后,后续代码执行情况
- Codeforces Round #200 (Div. 1)A. Rational Resistance 数学
- Oracle自动备份脚本(Linux)
- 框架:SpringMVC的工作原理
- initdz linux挖坑病毒分析
- 软件设计文档国家标准_GB8567--88
- 安全狗护航金砖厦门会晤 圆满完成任务
- 单片机常用的几种通信协议
- 珍惜时间, 珍惜生命
- C++/QT:获取当前路径并通过相对路径读取文件
- android连mysql注册界面代码_Android实现注册登录界面的实例代码
- Spring Boot 中统一异常处理最佳实践介绍
- 【语音识别】基于matlab矢量量化(VQ)说话人识别【含Matlab源码 575期】
- 如何使非域模式下的组策略对管理员帐号无效
- viper4android fx2.7,ViPER4Android FX下载-ViPER4Android FX(蝰蛇音效fx)2.7.1.0 安卓版下载_东坡手机下载...
- Hijacking tons of Instapage expired users Domains Subdomains
- java正则表达式验证标点符号
- 51单片机c语言试题及答案,单片机C语言期末考试题..
- 栈与堆的区别(内存分配与数据结构)
- 自编码器(autoencoder)了解一下
热门文章
- android DVM
- JavaScript 字符串函数
- symantec BESR 异机恢复
- 类似地图比例尺钩子下边框实现
- Luogu5816 [CQOI2010]内部白点
- [数论] 快速傅里叶变换FFT
- javamail 解码 base64 html格式邮件_关于JavaMail,我遇上的那些史前巨坑...(建议收藏)
- python pdf转txt_Python之pdf转txt
- linux脚本中sed -i,Linux Shell 脚本之sed命令详解
- 树莓派串口通信编码_树莓派和STM32通过USB和串口通信记录