hdu1430 魔板(康拓展开 bfs预处理)
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4050 Accepted Submission(s): 951
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
17245368
12345678
82754631
AC
思路:是先了解了康托展开再做这道题,想当于是用康拓展开给每一种状态弄一个独立的标号,可以快速找到某一种状态,所以就是先用12345678为初始状态,然后记录每一种状态的contor值,这里我用了把函数写在结构体里的方法,方便简洁(学习了网上一位大佬),然后比较难想就是,每一次输入的初态和末态并不都是12345678,如何将输入和bfs中的状态对应起来呢?
我们就需要置换一下。
置换: 原始态为“12345678” 例如 初态是 “45781236” 目态是 ”78451326“
目态的第一位‘7’ 在初态中是第三位, 而原始态的第三位是‘3’,故目态的第一位应该转换为‘3’,(就是将输入的值和12345678一一对应)就这样一次转换 最后目态转换为 34125768, 最后找出34125768对应的康拓值,输出就好了。
而字典序的话,每一次bfs都是按照ABC这样的顺序的,所以每种状态的步骤必然是最小字典序。
具体看代码。
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
using namespace std;
typedef long long ll;
const int N=40320+10;
int fact[9]= {1,1,2,6,24,120,720,5040,40320};
struct info{
int arr[8];
int val;//计算出来的康托展开的序号
string step;
void contor(){//把康托展开写在结构体里面
val=0;
for(int i=0;i<8;i++){
int t=0;
for(int j=i+1;j<8;j++){
if(arr[j]<arr[i])t++;
}
val+=t*fact[8-i-1];
}
val++;
}
void change_a(){
reverse(arr,arr+8);
step+='A';
}
void change_b(){
int temp=arr[3];
for (int i=3; i>0; --i)
arr[i]=arr[i-1];
arr[0]=temp;
temp=arr[4];
for (int i=4; i<7; ++i)
arr[i]=arr[i+1];
arr[7]=temp;
step+="B";
}
void change_c(){
int temp=arr[1];
arr[1]=arr[6];
arr[6]=arr[5];
arr[5]=arr[2];
arr[2]=temp;
step+='C';
}
};
int vis[N];
string ans[N];//记录每一种状态的操作
int re[8];
info s,t;
void bfs(){
queue<info>q;
vis[s.val]=1;
q.push(s);
info now,v;
while(!q.empty()){
now=q.front();
q.pop();
v=now;
int len=v.step.length();
if(len<1||v.step[len-1]!='A'){//去掉AA这样的情况
v.change_a();
v.contor();
if(!vis[v.val]){
vis[v.val]=1;
ans[v.val]=v.step;
q.push(v);
}
}
v=now;
if(len<3||v.step[len-1]!='B'||v.step[len-2]!='B'||v.step[len-3]!='B'){//去掉BBBB这样的情况
v.change_b();
v.contor();
if(!vis[v.val]){
vis[v.val]=1;
ans[v.val]=v.step;
q.push(v);
}
}
v=now;
if(len<3||v.step[len-1]!='C'||v.step[len-2]!='C'||v.step[len-3]!='C'){//去掉CCCC这样的情况
v.change_c();
v.contor();
if(!vis[v.val]){
vis[v.val]=1;
ans[v.val]=v.step;
q.push(v);
}
}
}
}
int main(){
for(int i=0;i<8;i++){
s.arr[i]=i+1;
}//初始化 12345678
s.contor();
bfs();
char ss[10];
while(scanf("%s",ss)!=EOF){
for(int i=0;i<8;i++){
re[ss[i]-'0']=i+1;
}//将输入的初始状态的字符 和12345678(bfs中的初始状态)一一对应
scanf("%s",ss);
for(int i=0;i<8;i++){
t.arr[i]=re[ss[i]-'0'];//找到当前的目标状态在bfs中对应的值
}
t.contor();
printf("%s\n",ans[t.val].c_str());
}
}
hdu1430 魔板(康拓展开 bfs预处理)的更多相关文章
- hdu-1430 魔板 康拓展开+映射优化
给定三种操作,将排列A转化为排列B,求最少步骤. 这种题目可以只跑一次bfs,比如只跑"12345678",那么如果遇到"23456781"->某个字符串 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- hdu1430魔板
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- 【HDOJ1043】【康拓展开+BFS】
http://acm.hdu.edu.cn/showproblem.php?pid=1043 Eight Time Limit: 10000/5000 MS (Java/Others) Memo ...
- HDU1430;魔板(BFS+康托展开)
传送门 题意 给出初始序列与终止序列,给出三种操作,问最少经过几次操作能使初始->终止,输出操作(字典序最小) 分析 字符串只有8个字符,使用康托展开. 1.BFS将所有序列从"123 ...
- HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)
Eight Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30176 Accepted: 13119 Special ...
- 洛谷 - P2730 - 魔板 Magic Squares - bfs
写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
随机推荐
- LookupError: unknown encoding: cp65001解决办法
一.之前手上做的一个web项目,漏洞频发,服务器用的是菜鸟云服务器,那个应急响应中心不错,想不到乌云倒了,白帽子竟然被阿里系养了,题外话了,首先感谢白帽子提的漏洞,同时也感慨自己安全知识,以及意识的薄 ...
- JS继承方式详解
js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...
- JS中的!= 、== 、!==、===的用法和区别
与c++中每一种类型都有明确的的定义不同:因JS中var定义存在,未具体区分类型,!=与==不能包含所有的条件,故加入!==与===用法: var num = 1; var str = '1'; va ...
- win10右击windows键没有反应解决方案(1707版本)
按Win+R打开运行,输入“regedit”打开注册表编辑器. 2.在“HKEY_CLASSES_ROOT”主键下找到“linkfile”或者".lnkfile"字符串值项,在右侧 ...
- (转)嵌入式C开发人员的最好笔试题目
约定: 1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了 2)数据类型 char 一个字节 1 byte int 两个字节 2 byte ( ...
- Mongo client - cross-platform MongoDB management tool
Mongo client for Ubuntu or Windows http://robomongo.org/download.html
- Entity Framework Tutorial Basics(37):Lazy Loading
Lazy Loading: One of the important functions of Entity Framework is lazy loading. Lazy loading means ...
- 美团热更新Robust Demo演示
1.Android Studio clone 远程Robust项目源码 gradle 同步依赖资源,可能需要半个小时左右. 2.生成样例apk包 配置app module下build.gradle 插 ...
- 树莓派(Raspberry Pi 3) centos7 扩容内存卡
在使用Win32DiskImager为一张空白的SD卡刷入新的centos7系统后,发现卡上的可用剩余空间并不大,用df -h查看,根目录下的空间使用率居然是25%,而且总空间也就2G左右.网上查到的 ...
- Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-3.1.xsd)
解决方法: 将 Preferences > XML > XML Files > Validation中"Honour all XML schema locations&qu ...