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 ...
随机推荐
- Celery 异步定时周期任务
1/什么是Celery Celery 是基于Python实现的模块,用于执行异步定时周期任务的 其结构的组成是由 1.用户任务app 2.管道 broker 用于存储任务 官方推荐 redis rab ...
- mac电脑链接安卓手机的方法
https://blog.csdn.net/liubin9043/article/details/78928253/ 我用了个爱莫 不错 http://web.airmore.com
- pycharm fiddler requests.exceptions.SSLError
一.SSL问题1.不启用fiddler,直接发https请求,不会有SSL问题(也就是说不想看到SSL问题,关掉fiddler就行) 2.启动fiddler抓包,会出现这个错误:requests.ex ...
- [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(二)【C++】
3. 创建带参数的委托 我们可以通过修改委托的签名来使其接受参数 比如我们需要接受一个参数的话,可以在 GameMode 中这样声明: DECLARE_DELEGATE_OneParam(FParam ...
- C#调用Excel宏
using System; using Excel = Microsoft.Office.Interop.Excel; namespace WindowsFormsApplication1 { /// ...
- Koa 框架整理
学习交流 Koa使用了ES6规范的generator和异步编程是一个更轻量级Web开发的框架,Koa 的先天优势在于 generator.由于是我个人的分享交流,所以Node基础.ES6标准.Web开 ...
- 第11课 enum、sizeof、typedef 分析
1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...
- keras基础-优化策略:mini-batch gradient decent
参考<Keras中文文档>http://keras-cn.readthedocs.io/en/latest/ 相关概念:神经网络优化器(优化策略).梯度下降.随机梯度下降.小批的梯度下降( ...
- Oracle 学习SQL
开始记录最近学习了一些基础的SQL知识. 说起数据库,想到当时学习数据库概论这本书的时候,就学了一些基本的SQL语句以及数据库理论知识,记得最当时考试的数据库范式的知识,不知当时是怎么过来的,到现在对 ...
- Jenkins Error cloning remote repo 'origin', slave node
使用jenkins pull git上的代码,在job中配置好源码管理后,构建时出现如题错误提示: 网上的资料几乎都是在说SSH的配置问题,因为博主项目建立在本地的git服务器上,所以在源码管理中选择 ...