hdoj1043 Eight(逆向BFS+打表+康拓展开)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043
思路:
由于自己对康拓展开用的太少,看到这个题没想到康拓展开,最开始打算直接转换为数字,但太占内存了,又想到可以将状态存进set,后来查了一下发现原来是考察康拓展开。另外就是需要打表预处理,这样快很多。BFS部分就是已知终点,从终点逆向搜索,并存每个状态的上一个状态以及操作,以便输出。
坑点:输入是多组输入,POJ那道题才是一组输入,卡在这一上午T_T。
有一组输入为12345678x,需要特殊处理,不能不输出,可以输出“lr”。
#include<bits/stdc++.h>
using namespace std; const int maxn=1e6+;
struct node{
char a[];
int x,y;
int cnt;
}tmp; int fac[];
int vis[maxn];
char path[maxn];
int pre[maxn];
int go[][]={-,,,,,,,-}; void init(){
fac[]=fac[]=;
for(int i=;i<;i++) fac[i]=fac[i-]*i;
} int cantour(char *s){
int ans=,k;
for(int i=;i<;i++){
k=;
for(int j=i+;j<;j++)
if(s[j]<s[i]) k++;
ans+=k*fac[-i];
}
return ans;
} void bfs(){
queue<node> q;
for(int i=;i<;i++)
tmp.a[i]=i++'';
tmp.a[]='';
tmp.x=,tmp.y=,tmp.cnt=cantour(tmp.a);
vis[tmp.cnt]=;
q.push(tmp);
path[tmp.cnt]=-;
while(!q.empty()){
node now=q.front();q.pop();
int nx=now.x,ny=now.y,ncnt=now.cnt;
for(int i=;i<;i++){
int xx=nx+go[i][],yy=ny+go[i][];
if(xx<||xx>||yy<||yy>) continue;
strcpy(tmp.a,now.a);
swap(tmp.a[nx*+ny],tmp.a[xx*+yy]);
tmp.x=xx,tmp.y=yy,tmp.cnt=cantour(tmp.a);
if(!vis[tmp.cnt]){
vis[tmp.cnt]=;
pre[tmp.cnt]=ncnt;
if(i==) path[tmp.cnt]='d';
else if(i==) path[tmp.cnt]='l';
else if(i==) path[tmp.cnt]='u';
else path[tmp.cnt]='r';
q.push(tmp);
}
}
}
} void print(int f){
while(path[f]!=-){
printf("%c",path[f]);
f=pre[f];
}
printf("\n");
} int main(){
char c[],ch;
int f;
init();
bfs();
while(scanf(" %c",&ch)!=EOF){
if(ch=='x') c[]='';
else c[]=ch;
for(int i=;i<;i++){
scanf(" %c",&ch);
if(ch=='x') c[i]='';
else c[i]=ch;
}
f=cantour(c);
if(path[f]==-) printf("lr\n");
else if(!vis[f]) printf("unsolvable\n");
else print(f);
}
return ;
}
hdoj1043 Eight(逆向BFS+打表+康拓展开)的更多相关文章
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU 1043 Eight(反向BFS+打表+康托展开)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目大意:传统八数码问题 解题思路:就是从“12345678x”这个终点状态开始反向BFS,将各 ...
- hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
题意: 题意就是八数码,给了一个3 * 3 的矩阵,上面有八个数字,有一个位置是空的,每次空的位置可以和他相邻的数字换位置,给你一些起始状态 ,给了一个最终状态,让你输出怎么变换才能达到目的. 思路: ...
- poj 1077-Eight(八数码+逆向bfs打表)
The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...
- hdu 1043 Eight (八数码问题)【BFS】+【康拓展开】
<题目链接> 题目大意:给出一个3×3的矩阵(包含1-8数字和一个字母x),经过一些移动格子上的数后得到连续的1-8,最后一格是x,要求最小移动步数. 解题分析:本题用BFS来寻找路径,为 ...
- hdu-1043(八数码+bfs打表+康托展开)
参考文章:https://www.cnblogs.com/Inkblots/p/4846948.html 康托展开:https://blog.csdn.net/wbin233/article/deta ...
- HDU1430 BFS + 打表 + 康托展开
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完 ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 【HDOJ1043】【康拓展开+BFS】
http://acm.hdu.edu.cn/showproblem.php?pid=1043 Eight Time Limit: 10000/5000 MS (Java/Others) Memo ...
随机推荐
- Parity 钱包启动配置
Parity. Ethereum Client. By Wood/Paronyan/Kotewicz/Drwięga/Volf et al. Copyright 2015, 2016, 2017, 2 ...
- 廖雪峰Java1-2Java程序基础-3整数运算
1.四则运算规则 int i =(100 + 200) * (99 -88);//3300 int n = i + 9;//3309 //除法结果为整数 int q = n / 100;//33 // ...
- php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)
今天在做一个和java程序接口的架接,java那边需要我这边(PHP)对传过去的值进行AES对称加密,接口返回的结果也是加密过的(就要用到解密),然后试了很多办法,也一一对应了AES的key密钥值,偏 ...
- 3dsMax模型转UE4
转自:http://blog.csdn.net/qq_24835213/article/details/68063344 一.模型设置: 1.将Vary材质转成标准材质 2.将模型减面 3.加一套UV ...
- Python 实现双向链表(图解)
原文:https://blog.csdn.net/qq490691606/article/details/49948263 git 路径 https://github.com/wangpanjun/d ...
- MySQL数据库储存引擎Inoodb一--记录储存结构
在开文我先说明一下,接下来的数据库知识文章都是在微信公众号“我们都是小青蛙”学习然后在通过自己的理解进行书写的.有兴趣的朋友可以去关注这个微信公众号.话不多说,我们在日常使用数据库进行数据持 久化的时 ...
- System Error:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
System Error:/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found 1.运行程序是,系统报错库文件libstdc++. ...
- Mac上如何用命令修改文件内容
首先打开iTerm,切到文件所在的文件夹目录下 cd xx 然后进入编辑模式 vim xx.xx 然后插入修改 shift + i 修改之后退出插入模式 esc 保存退出 shift + : wq
- tornado-模板,转义,上传静态文件
class MainHandler(tornado.web.RequestHandler): def get(self): self.render("ces.html") def ...
- Latex Error:‘acmart.cls’ not found 解决方案:
windows下latex编译ACM论文模板时,出现Latex Error:‘acmart.cls’ not found,解决方案: 首先cd至模板所在目录下,然后运行以下命令: tex acma ...