题意:就是恢复成1,2,3,4,5,6,7,8,0;

分析:暴力BFS预处理,所有路径,用康拓展开判重,O(1)打印 93ms 还是很快的

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N=;
int fac[]= {,,,,,,,,,};
int aim;
int cantor(char s[])
{
int ans=;
for(int i=,j=; i<=; ++i,--j)
{
int tmp=;
for(int k=i+; k<=; ++k)
if(s[i]>s[k])++tmp;
ans+=(tmp*fac[j]);
}
return ans;
}
struct Node
{
char s[];
int hs;
};
struct asd
{
bool vis;
char c;
int pre;
}o[];
queue<Node>q;
void bfs()
{
Node a;
for(int i=; i<=; ++i)
a.s[i]=''+i;
a.s[]='';
aim=a.hs=cantor(a.s);
o[aim].vis=;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
int now=a.hs;
int x;
for(int i=; i<=; ++i)
if(a.s[i]=='')x=i;
if(x->)
{
bool flag=;
swap(a.s[x],a.s[x-]);
a.hs=cantor(a.s);
if(o[a.hs].vis)
flag=;
if(!flag)
{
o[a.hs].vis=;
o[a.hs].c='d';
o[a.hs].pre=now;
q.push(a);
}
swap(a.s[x],a.s[x-]);
}
if(x+<)
{
bool flag=;
swap(a.s[x],a.s[x+]);
a.hs=cantor(a.s);
if(o[a.hs].vis)
flag=;
if(!flag)
{
o[a.hs].vis=;
o[a.hs].c='u';
o[a.hs].pre=now;
q.push(a);
}
swap(a.s[x],a.s[x+]);
}
if(x%!=)
{
bool flag=;
swap(a.s[x],a.s[x-]);
a.hs=cantor(a.s);
if(o[a.hs].vis)
flag=;
if(!flag)
{
o[a.hs].vis=;
o[a.hs].c='r';
o[a.hs].pre=now;
q.push(a);
}
swap(a.s[x],a.s[x-]);
}
if(x%)
{
bool flag=;
swap(a.s[x],a.s[x+]);
a.hs=cantor(a.s);
if(o[a.hs].vis)
flag=;
if(!flag)
{
o[a.hs].vis=;
o[a.hs].c='l';
o[a.hs].pre=now;
q.push(a);
}
swap(a.s[x],a.s[x+]);
}
}
}
char str[],tmp[];
void print(int u)
{
while(u!=aim)
{
printf("%c",o[u].c);
u=o[u].pre;
}
printf("\n");
}
int main()
{
for(int i=;i<;++i)
o[i].vis=;
bfs();
while(gets(str))
{
int l=;
for(int i=; str[i]!=''; ++i)
{
if(str[i]=='x')tmp[++l]='';
else if(str[i]>=''&&str[i]<='')tmp[++l]=str[i];
}
int ans=cantor(tmp);
if(!o[ans].vis)
printf("unsolvable\n");
else
print(ans);
}
return ;
}

HDU 1043 Eight BFS的更多相关文章

  1. HDU 1043 Eight (BFS&#183;八数码&#183;康托展开)

    题意  输出八数码问题从给定状态到12345678x的路径 用康托展开将排列相应为整数  即这个排列在全部排列中的字典序  然后就是基础的BFS了 #include <bits/stdc++.h ...

  2. Eight HDU - 1043 (双向BFS)

    记得上人工智能课的时候老师讲过一个A*算法,计算估价函数(f[n]=h[n]+g[n])什么的,感觉不是很好理解,百度上好多都是用逆向BFS写的,我理解的逆向BFS应该是从终点状态出发,然后把每一种状 ...

  3. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  4. HDU 1043 Eight(八数码)

    HDU 1043 Eight(八数码) 00 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)   Problem Descr ...

  5. Eight POJ - 1077 HDU - 1043 八数码

    Eight POJ - 1077 HDU - 1043 八数码问题.用hash(康托展开)判重 bfs(TLE) #include<cstdio> #include<iostream ...

  6. HDU - 1043 - Eight / POJ - 1077 - Eight

    先上题目: Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. HDU 1043 Eight 八数码问题 A*算法(经典问题)

    HDU 1043 Eight 八数码问题(经典问题) 题意 经典问题,就不再进行解释了. 这里主要是给你一个状态,然后要你求其到达\(1,2,3,4,5,6,7,8,x\)的转移路径. 解题思路 这里 ...

  8. hdu 1043 pku poj 1077 Eight (BFS + 康拓展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 http://poj.org/problem?id=1077 Eight Time Limit: 1000 ...

  9. HDU 1043 Eight(双向BFS+康托展开)

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...

随机推荐

  1. apache本地和局域网访问设置

    apache本地和局域网访问设置 最近做项目需要同事ajax发项目给我,因为是测试环境,所以需要能访问我的服务器.我服务器直接用的wampserver.因为没有接触过,所以百度了一下,都是没有成功,后 ...

  2. UITableView实现格瓦拉飞天投票模块-b

    格瓦拉目前来说动画效果确实做的还比较好,虽然不是说很炫但做到精致,这次就模仿了它投票的模块.其实想到要实现它还是有很多方法,不过这次我还是采用了苹果自带控件UITableView简简单单来实现它,再次 ...

  3. shell复习笔记----用户管理

    $ who    可以知道系统上有多少登陆 $who |wc -l 计算用户个数 注意:|是管道符号,可以在两个程序之间建立管道(pipeline):who 的输出,成了 wc 的输入, wc 所列出 ...

  4. bzoj 1318: [Spoj744] Longest Permutation 智商题

    1318: [Spoj744] Longest Permutation Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 361  Solved: 215 ...

  5. uva 437 hdu 1069

    dp  将石块按三个面存入队列  按底面积排序  dp就最大高度  按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...

  6. 建立Clojure开发环境-使用IDEA和Leiningen

    OS: Mac OS X 10.10 IDEA 14.0.2 Community Edition 安装Leiningen 按照http://leiningen.org/的指南安装lein 阅读Lein ...

  7. c缺陷与陷阱笔记-第四章 连接

    1.变量的声明. 在不同的源文件中,应该是1个定义+多个声明的形式存在的,并且声明的类型和定义的类型要一样,否则可能会报错. 声明 : extern 类型 变量名 声明并定义: extern 类型 变 ...

  8. git 命令整理

    记录一些git 命令,以便自己以后查阅 基本命令   1.git add (保存工作区的变动到暂存区) git add . 和git add -A把整个工作区添加到暂存区 2.git commit ( ...

  9. Android:简单的开场界面

    接通过ImageView创建一个全屏的图片: <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  10. MySQL 5.6 安装配置

    mysql 5.6.17下载安装图解_百度经验 http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html windows 8 系统将 ...