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的数字,任意 ...
随机推荐
- iOS - Runloop个人总结
调用堆栈: 程序运行之前,自上而下启动 iOS端用的所用系统framework都是动态链接的. dyld:The dynamic link editor 动态链接器
- 掘金chrome插件
掘金chrome插件 点击下载 掘金是一个高质量的互联网技术社区,而其提供的一个chrome插件个人觉得非常不错.最终效果如下所示: 每天都会有优秀的内容更新.
- 使用angularjs定义html中的属性ng-attr-(suffix)
html中的属性很多,同样可以使用angularjs来定义: ng-attr-(suffix)=只能使用变量定义 <div title="angularjs中的title"& ...
- js切换实现背景颜色
<script type="text/javascript"> obj=document.getElementsByTagName('h1'); ;i<obj.l ...
- linux安装pip
1.先说一下什么是pippip 是"A tool for installing and managing Python packages.",也就是说pip是python的软件安装 ...
- 深入浅出MyBatis
参考文献:深入浅出MyBatis MyBatis功能架构图: MyBatis内部原理流程图: 详情见:深入浅出MyBatis
- Xcode打印frame id
开启 打开终端输入三条命令: . touch ~/.lldbinit . echo display @import UIKit >> ~/.lldbinit . echo target s ...
- Occlusion Culling
遮挡剔除 http://www.bjbkws.com/online/1092/ unity遮挡剔除(应用) http://www.unitymanual.com/thread-37302-1-1.ht ...
- 简单CSS布局留用
1.导航栏固定显示代码,文字居中,z-index header{ position: fixed; top: 0px; left: 10%; width: 80%; height: 80px; bor ...
- centos 7.0 ln命令 和chkconfig 命令介绍 开机自动启 服务
有时候centos需要 程序开机启动的时候 自启动 首先在 /etc/init.d/ cd /etc/init.d 文件夹下建立开机启动项 使用ln命令 使用方式 : ln [options] so ...