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的数字,任意 ...
随机推荐
- Node.js使用Mongoose包操作MongoDB数据库
1. 安装Mongoose npm install mongoose 2. 使用 2.1 创建连接 var mongoose = require('mongoose'); mongoose.conne ...
- 【Alpha版本】冲刺-Day2
队伍:606notconnected 会议时间:11月10日 会议总结 张斯巍(433) 今天安排:把昨天没完成的做好,主界面图标的修改,侧边栏背景设计 完成度:85% 明天计划:个人信息界面设计.优 ...
- BZOJ1812 [IOI2005]river
传送门: 很常规的一道树规,转为左儿子右兄弟. 然后$f[node][anc][K]$表示在node节点上,最近的有贡献祖先在anc上,在node的儿子和兄弟上有k个有贡献节点的最优值. 然后得出以下 ...
- HDU1698Just a Hook(线段树 + 区间修改 + 求和)
题目链接 分析:1-N区间内初始都是1,然后q个询问,每个询问修改区间[a,b]的值为2或3或者1,统计最后整个区间的和 本来想刷刷手速,结果还是写了一个小时,第一个超时,因为输出的时候去每个区间查找 ...
- href和src的使用场景
href和src的使用场景 href和src的用法虽然简单,但是有时候会突然记不起来该怎么用,且两者不可相互替换,下面列出来方便记忆,并给出具体区别. href的使用: 1.外部css引用:<l ...
- js008-BOM
js008-BOM 本章内容: 1.理解window对象-BOM的核心 2.控制窗口.框架和弹出窗口 3.利用location对象中的页面信息 4.使用navigation对象了解浏览器 ECMASc ...
- Runner之记计帐项目的典型用户和用户场景
项目任务:编写日历选择界面和查明细界面(查看某一天的具体收支出状况) 1.背景 ①典型用户 (1)姓名:张云 (2)年龄:17~23 (3)收入:家长给的生活费与自己兼职(1500元/月) (4)代表 ...
- Brew Command Not Found
安装了brew后,居然找不到brew命令.于是uninstall后再次install,居然还是Brew Command Not Found. 解决办法: http://stackoverflow.co ...
- System.BadImageFormatException: Could not load file or assembly
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe C:\_PRODUKCIJA\Debug\DynamicHtmlT ...
- GoLang之网络
GoLang之网络 Go语言标准库里提供的net包,支持基于IP层.TCP/UDP层及更高层面(如HTTP.FTP.SMTP)的网络操作,其中用于IP层的称为Raw Socket. net包的Dial ...