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 ...
随机推荐
- Python网络爬虫-Scrapy框架
一.简介 Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适. 二.使用 1.创建sc ...
- Date类型之组件方法
在之前总结了Date类型的继承方法和格式化方法,现在来总结一下日期时间组件方法,这些方法都是直接取得和设置日期值中特定部分的方法. var d = new Date(); //getDate() 从 ...
- Bootstrap-CSS:网格系统
ylbtech-Bootstrap-CSS:网格系统 1.返回顶部 1. Bootstrap 网格系统 本章节我们将讲解 Bootstrap 的网格系统(Grid System). Bootstrap ...
- [转][C#]验证
文件下载 本文仅做备份,参考自:http://www.cnblogs.com/LoveJenny/p/opensource_software_license_tool__easyhelper_easy ...
- 查找占用CPU高线程
1.根据进程号查看线程 ps -mp pid -o THREAD,tid,time 2 把tid值转成16进制 printf "%x\n" tid 3.根据上面获取到的16进制数据 ...
- Linux命令详解-文件系统管理
1. 外部设备简介 (1.)硬盘的分类: IDE硬盘 ./dev/hda hdb,hdc… 分区后:/dev/hda1 /dev/hda2 scsi硬盘: /dev/sda sdb,sdc ...
- 【转】SQL模糊查询
在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任 ...
- kudu和kudu-impala的安装流程
安装apache的kudu 第一步:下载rpm包 http://archive.cloudera.com/kudu/redhat/6/x86_64/kudu/5.11.0/RPMS/x86_64/ 第 ...
- solr查询空值、null、不存在的字段的方法
正常情况下我们都是按有值的方式去搜索,但是有时候有一些字段为null,solr中就没有存储进去,我们怎么获取这个字段不存在为条件的搜索结果了,我们只需要在搜索字段前加上负号,如下图 摘要: Solr的 ...
- 抽象工厂模式( Abstract Factory )
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.解决多产品多等级结构.模式的类图如下: 抽象工厂模式的优点: 易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一 ...