hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)
题意
中文题意
思路
做这题的前置技能学习
康托展开
这个东西我认为就是在排列组合问题上的Hash算法,可以压缩空间。A*搜索。
这里我使用了像k短路一样的做法,从最终状态倒回去预处理一遍距离,但是跑了0.8s,可能是预处理花费的时间太多了。有些人用曼哈顿距离估价,跑了0.2s。
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
typedef long long LL;
struct Node {
int x, y, f, g, kt, mm[4][4];
bool operator < (const Node &rhs) const {
return f > rhs.f;
}
};
int init[4][4] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 0 }
};
int mp[4][4], ans, h[500001], vis[500001], target;
int f[10], dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int kangtuo(int mp[4][4]) {
int sum = 0;
for(int i = 0; i < 9; i++) {
int now = 0;
for(int j = i + 1; j < 9; j++) {
if(mp[i/3][i%3] > mp[j/3][j%3]) now++;
}
sum += now * f[9-i-1];
} return sum + 1;
}
void BFS(int x, int y) {
memset(h, INF, sizeof(h));
queue<Node> que;
Node now = (Node) {x, y, 0, 0};
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++)
now.mm[i][j] = init[i][j];
h[target] = 0;
que.push(now);
while(!que.empty()) {
Node now = que.front(); que.pop();
int x = now.x, y = now.y, f = now.f;
for(int i = 0; i < 4; i++) {
now.x = x + dx[i], now.y = y + dy[i];
if(now.x < 0 || now.x > 2 || now.y < 0 || now.y > 2) continue;
swap(now.mm[x][y], now.mm[now.x][now.y]);
int nf = f + 1, nkt = kangtuo(now.mm);
now.f = nf;
if(h[nkt] == INF) {
h[nkt] = nf;
que.push(now);
}
swap(now.mm[x][y], now.mm[now.x][now.y]);
}
}
}
void YCL() {
BFS(2, 2);
}
int Astar(int x, int y) {
priority_queue<Node> que;
memset(vis, 0, sizeof(vis));
vis[kangtuo(mp)] = 1;
Node now = (Node) { x, y, 0, 0, kangtuo(mp)};
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
now.mm[i][j] = mp[i][j];
que.push(now);
while(!que.empty()) {
now = que.top(); que.pop();
int x = now.x, y = now.y, f = now.f, g = now.g, kt = now.kt;
if(kt == target) return f;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if(nx < 0 || nx > 2 || ny < 0 || ny > 2) continue;
swap(now.mm[x][y], now.mm[nx][ny]);
int nkt = kangtuo(now.mm);
now.x = nx, now.y = ny, now.g = g + 1, now.f = now.g + h[nkt], now.kt = nkt;
if(!vis[nkt]) {
vis[nkt] = 1;
que.push(now);
}
swap(now.mm[x][y], now.mm[nx][ny]);
}
} return -1;
}
int main() {
f[0] = 1;
for(int i = 1; i < 9; i++) f[i] = f[i-1] * (i);
target = kangtuo(init);
YCL();
int t; scanf("%d", &t);
while(t--) {
int ix, iy;
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++) {
scanf("%d", &mp[i][j]);
if(mp[i][j] == 0) ix = i, iy = j;
}
ans = Astar(ix, iy);
if(~ans) printf("%d\n", ans);
else puts("No Solution!");
}
return 0;
}
hihoCoder 1312:搜索三·启发式搜索(A* + 康托展开)的更多相关文章
- hihoCoder #1312 : 搜索三·启发式搜索(A*, 康托展开)
原题网址:http://hihocoder.com/problemset/problem/1312 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在小Ho的手机上有 ...
- 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
[题目链接]:http://hihocoder.com/problemset/problem/1312?sid=1092363 [题意] [题解] 定义一个A*函数 f = step+val 这里的v ...
- 【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
[题目链接]:http://hihocoder.com/problemset/problem/1312?sid=1092352 [题意] [题解] 从末状态的123456780开始逆向搜; 看它能到达 ...
- hdu 1430(BFS+康托展开+映射+输出路径)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- 康托展开:对全排列的HASH和还原,判断搜索中的某个排列是否出现过
题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2297 前置技能:(千万注意是 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- HDU 1430 魔板(康托展开+BFS+预处理)
魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu1430魔板(BFS+康托展开)
做这题先看:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description 在魔方风靡全球之后不久,Rubik先 ...
- poj1077(康托展开+bfs+记忆路径)
题意:就是说,给出一个三行三列的数组,其中元素为1--8和x,例如: 1 2 3 现在,需要你把它变成:1 2 3 要的最少步数的移动方案.可以右移r,左移l,上移u,下移dx 4 6 4 5 67 ...
随机推荐
- WPF 四种尺寸单位
原文:WPF 四种尺寸单位 像素 px 默认单位可以省略 厘米cm 英寸 in 点 pt 1in = 96px 1cm=96/2.42px 1pt=96/72px
- 两个同名controller导致调用崩溃
之前遇到一个很诡异的bug,大概情况如下: 生成成功,运行正常,调试正常 但是调用目标controller的目标方法,运行自动中断,调试自动中断 没有任何明确的错误提示,包括调试都没有弹窗报错 调用其 ...
- node.js开发笔记之EXPRESS与EJS之ejs标签v20140329
本次记录下ejs的渲染标签 node既然是javascrip的,那么很多在前端执行代码的方式都可以放在后台从而达到无缝连接! 比如 var ygxx = function(){document.get ...
- 数据源Source 目标Target
数据源Source-目标Target 数据源实现INotifyPropertyChanged接口,实现“通知”目标实现依赖属性 举例 后台的数据源,实现INotifyPropertyChanged接口 ...
- QTextStream 居然接受FILE*这样的传统参数
实在是太爽.太牛了,无话可说-
- 细谈unity资源管理的设计
一.概要 本文主要说说Unity是如何管理的,基于何种方式,基于这种管理方式,又该如何规划资源管理,以及构建bundle,是后面需要详细讨论的. 二.Unity的资源管理方式 2.1 资源分类 uni ...
- GIS基础软件及操作(十一)
原文 GIS基础软件及操作(十一) 练习十一.3D 可视分析 1.对地理数据进行透视观察.三维浏览:2.制作飞行动画 GIS数据三维显示 (1) 运行程序:[开始菜单]>>[所有程序]&g ...
- 理解typedef(转)
// 从别人那转的,调整下格式便于阅读. 首先请看看下面这两句: typedef ]; typedef void (*p)(void); 如果你能一眼就看出它们的意思,那请不要再往下看了.如果你不太理 ...
- 为新项目添彩的 10+ 超有用 JavaScript 库
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- KmdKit4D 0.01正式版发布了(0.02版已放出)(Delphi做驱动)
此版本较0.01预览版已经有了脱胎换骨的变化,主要表现在以下几个方面: 1.对程序的结构进行了调整,将原来的ntutils.dcu分成fcall.dcu.halfcall.dcu和macros. ...