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 ...
随机推荐
- bzoj2458 最小三角形
Description Xaviera现在遇到了一个有趣的问题.平面上有N个点,Xaviera想找出周长最小的三角形.由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题.为了减小问题的 ...
- 接口测试maven管理
接口测试框架选择 界面化工具,针对不会编码的测试人员: 1.Jmeter性能测试工具,不具备完备的接口测试框架功能 2.Robotframerwork 3.PostMan 推荐框架: ResrAssu ...
- Vuex 状态管理模式
Vuex 是一个专为 Vue.js 设计的状态管理模式 vuex解决了组件之间同一状态的共享问题.当我们的应用遇到多个组件共享状态时,会需要: 多个组件依赖于同一状态.传参的方法对于多层嵌套的组件将会 ...
- 一点ExtJS开发的感悟
虽然项目一直采用ExtJS作为前端开发,接触到了一些ExtJS 的一些场景界面,自己也尝试封装一些组件,对于开发70%基本可以满足需求.遇到最为麻烦的就是Ext的模版或者直接拼接字符串再进行eval转 ...
- Sublime Text 3 个人使用总结
待更新 Sublime Text 3\Packages\FileHeader\template\header
- python学习笔记一和PHP的一些对比
python和php一样是 解释性语言 php和php一样 定义变量不需要指定类型,C语言中的print函数 在python中也是适用的 python编码 适用缩进 4个空格,通常存储为UTF-8模 ...
- idea建立一个maven项目
前言:虽然之前实习的时候有过spring框架的实践,但是因为基本上都是在已有的基础上进行修修补补,并没有对Spring框架有深刻的理解.所以从今天起,要从零开始对Spring框架进行学习.在此之前,第 ...
- 24. Swap Nodes in Pairs + 25. Reverse Nodes in k-Group
▶ 问题:单链表中的元素进行交换或轮换. ▶ 24. 每两个元素进行翻转.如 [1 → 2 → 3 → 4 → 5] 变换为 [2 → 1 → 4 → 3 → 5] ● 初版代码,4 ms class ...
- 2.vo传参模式和ModerDriven传参模式
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html Copy上面的myStruts2项目,改名为myStruts2Vo项目.作如 ...
- 1.JSONObject与JSONArray的使用
参考文献: http://blog.csdn.net/huangwuyi/article/details/5412500 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib ...