hdu.1430.魔板(bfs + 康托展开)
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170 Accepted Submission(s): 455
1 2 3 4 8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321 B: 每行同时循环右移一格,如上图可变换为41236785 C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
17245368
12345678
82754631
AC
#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
#include<stdio.h>
using namespace std ;
const int MAXN = ; //由于此题数字1~8,康托展开的所有情况为8!,共40320种
const int fac[] = {,,,,,,,}; //康托展开中用到的0~7的阶乘
string ans[MAXN]; //存储各状态的变化步骤,预处理完成
struct node {
int a[];
int n;
} u,v;
void A(node &t) //A操作 {
std::reverse (t.a , t.a + ) ; }
void B(node &t) //B操作 {
std::rotate (t.a , t.a + , t.a + ) ;
std::rotate (t.a + , t.a + , t.a + ) ;
}
void C(node &t) //C操作 {
std::swap(t.a[],t.a[]);
std::swap(t.a[],t.a[]);
std::swap(t.a[],t.a[]); }
int contor(node &t) //康托展开 {
int tmp, num = ;
for(int i=; i<; i++)
{
tmp = ;
for(int j=i+; j<; j++)
{
if(t.a[j] < t.a[i])
{
tmp++; } }
num += tmp*fac[-i]; }
return num; }
void Init(void) {
void (*ptr[])(node&); //定义函数指针
ptr[] = A;
ptr[] = B;
ptr[] = C; //指向对应函数方便处理 int mark[MAXN] = {}; //设置标记
mark[] = ; for(int i=; i<; i++) //由初始状态12345678开始
{
u.a[i] = i+; }
u.n = contor(u); queue<node>que;
que.push(u);
while(!que.empty())
{
u = que.front();
que.pop();
for(int i=; i<; i++) //三种变换
{
v = u;
(*ptr[i])(v);
v.n = contor(v); //对副本执行操作并康托展开
if(mark[v.n] == ) //重复
{
char ch = 'A' + i;
ans[v.n] = ans[u.n] + ch; //记录步骤 mark[v.n] = ; //标记
que.push(v); } } } }
int main() {
//freopen ("a.txt" , "r" , stdin ) ;
Init();
char a[] = {},b[] = {};
while(~ scanf ("%s" , a))
{
scanf ("%s" , b) ;
int n[];
for(int i=; i<; i++) //把初态置换成12345678
{
n[a[i] - ''] = i+;
} for(int i=; i<; i++) //把目标状态相对于初态置换
{
u.a[i] = n[b[i] - '']; } cout<<ans[contor(u)]<<endl; //输出由12345678到目标态的步骤 }
return ;
}


hdu.1430.魔板(bfs + 康托展开)的更多相关文章
- 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先 ...
- HDU - 1430 魔板 (bfs预处理 + 康托)
对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...
- hdu 1430 魔板 (BFS+预处理)
Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...
- HDU - 1430 魔板 【BFS + 康托展开 + 哈希】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...
- HDU_1430——魔板,预处理,康托展开,置换,string类的+操作
Problem Description 在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板.魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示.任一时刻魔板的状态可 ...
- [HDU 1430] 魔板
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1430 魔板 康托展开 + 很好的映射
http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...
- HDU_1043 Eight 【逆向BFS + 康托展开 】【A* + 康托展开 】
一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=1043 二.两种方法 该题很明显,是一个八数码的问题,就是9宫格,里面有一个空格,外加1~8的数字,任意 ...
随机推荐
- C#位操作与枚举的应用
看到代码里有用位操作来判断条件的,以前没有这么用过,做个笔记: int add = 2; int modify = 4; int delete = 8; Console.WriteLine((add ...
- fzuoop期中练习
5-1 科学计数法的值 科学计数法是一种数学专用术语.将一个数表示成 a×10的n次幂的形式,其中1≤|a|<10,n为整数,这种记数方法叫科学计数法.例如920000可以表示为9.2*10^5 ...
- python获取知乎日报另存为txt文件
前言 拿来练手的,比较简单(且有bug),欢迎交流~ 功能介绍 抓取当日的知乎日报的内容,并将每篇博文另存为一个txt文件,集中放在一个文件夹下,文件夹名字为当日时间. 使用的库 re,Beautif ...
- join的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join( ...
- autofac 注入普通服务和WCF服务
using Autofac;using Autofac.Builder;using Autofac.Core; //实现Autofac扩展 public static AutofacRegisterW ...
- Java类集
类集就是一个动态的对象数组,是对一些实现好的数据结构进行了包装,这样在使用时就会非常方便,最重要的是类集框架本身不受对象数组长度的限制. 类集框架的主要接口
- cmake 编译 c++ dll 的一个例子
CMakeLists.txt project(xxx) add_library(xxx SHARED xxx.cpp) add_executable(yyy yyy.cpp) target_link_ ...
- 在Nginx服务器中设置多个站点
这里以配置1个站点(1个域名)为例,n 个站点可以相应增加调整, 假设:IP地址: 127.0.0.1域名1 phpmyadmin.zhengwen.cn 放在 /www/phpmyadmin.zhe ...
- input 获取当前id,name
<input name=" src="toright.png" value="mp3"> <script language=&quo ...
- SPL--spl_autoload_register
spl_autoload_register() : 调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是调用__autoload函数. 解决问题: ...