经典的八数码问题,用来练习各种搜索=_=。这题我用的A*做的,A*的主要思想就是在广搜的时候加了一个估价函数,用来评估此状态距离最终状态的大概距离。这样就可以省下很多状态不用搜索。对于每个状态设置一个函数 h(x),这就是估价函数了(可能名词不太对请见谅),再设置一个函数 g(x), 这存的是初始状态到当前状态所用步数(或距离,视估价函数而定),再设函数 f(x) = g(x) + h(x),我们对每个状态的 f(x)的值进行排序, 然后从当前 f(x) 最小的状态继续搜索,直到搜索到最终状态或者没有后继状态。

上代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#define N 10
#define M 500000
using namespace std; struct sss
{
int state[N];
int num, place;
};
priority_queue<sss> q; int f[M], g[M] = {}, fa[M] = {}, move[M] = {};
sss begin, end;
int step[][] = {{-,},{,-},{,},{,}};
int color[M] = {}; bool operator < (sss a, sss b) { return f[a.num] > f[b.num]; }
bool operator == (sss a, sss b) { return a.num == b.num; } int h(sss a) // h(v)
{
int z = ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= ; ++j)
{
int x = (i-)*+j;
z += abs(i-(a.state[x]-)/) + abs(j-(a.state[x]-(a.state[x]-)/*));
}
return z;
} int jiecheng[N] = {,,,,,,,,,};
int make_num(sss a) // 康拓展开
{
int ans = ; bool xiao[N] = {};
for (int i = ; i <= ; ++i)
{
int count = ; xiao[a.state[i]] = ;
for (int j = ; j < a.state[i]; ++j)
if (!xiao[j]) count++;
ans += count * jiecheng[N-i-];
}
return ans;
} bool in(sss now, int mo) // 移动可行
{
int x = (now.place-)/+, y = now.place-(x-)*;
x += step[mo-][]; y += step[mo-][];
if (x < || x > || y < || y > ) return false;
else return true;
} void A_star() // A*
{
q.push(begin); f[begin.num] = h(begin);
while (!q.empty())
{
sss u = q.top(); q.pop();
if (u == end)
return;
for (int i = -; i <= ; i+=)
{
if (!in(u,(i+)/)) continue;
sss v; v = u; swap(v.state[u.place+i], v.state[u.place]);
v.place = u.place + i; v.num = make_num(v);
if (color[v.num] == )
{
if (g[u.num] + < g[v.num])
{
f[v.num] = f[v.num] - g[v.num] + g[u.num] + ;
g[v.num] = g[u.num] + ; move[v.num] = i;
q.push(v); fa[v.num] = u.num;
}
}
else if (color[v.num] == )
{
if (g[u.num] + < g[v.num])
{
f[v.num] = f[v.num] - g[v.num] + g[u.num] + ;
g[v.num] = g[u.num] + ; fa[v.num] = u.num;
q.push(v); color[v.num] = ; move[v.num] = i;
}
}
else
{
g[v.num] = g[u.num] + ;
f[v.num] = h(v) + g[v.num];
color[v.num] = ; fa[v.num] = u.num;
q.push(v); move[v.num] = i;
}
}
color[u.num] = ;
}
} char change(int x)
{
if (x == -) return 'l';
else if (x == -) return 'u';
else if (x == ) return 'r';
else return 'd';
} void print() // 输出
{
char s[M], snum = ;
int k = fa[end.num];
s[++snum] = change(move[end.num]);
while (k != begin.num)
{
s[++snum] = change(move[k]);
k = fa[k];
}
for (int i = snum; i > ; --i)
printf("%c", s[i]);
printf("\n");
} int main()
{
char s[];
for (int i = ; i <= ; ++i)
{
scanf("%s", s);
if (s[] != 'x') begin.state[i] = s[] - '';
else
{
begin.state[i] = ;
begin.place = i;
}
end.state[i] = i;
}
begin.num = make_num(begin);
end.num = make_num(end);
A_star();
print();
}

poj 1077 Eight(A*)的更多相关文章

  1. POJ 2431 Expedition(探险)

    POJ 2431 Expedition(探险) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A group of co ...

  2. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

  3. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  4. POJ 1847 Tram (最短路径)

    POJ 1847 Tram (最短路径) Description Tram network in Zagreb consists of a number of intersections and ra ...

  5. HDU 1043 & POJ 1077 Eight(康托展开+BFS+预处理)

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30176   Accepted: 13119   Special ...

  6. HDU 1043 & POJ 1077 Eight(康托展开+BFS | IDA*)

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30176   Accepted: 13119   Special ...

  7. POJ 1077 Eight (BFS+康托展开)详解

    本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...

  8. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

  9. POJ题目分类(转)

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

随机推荐

  1. delphi 保存网页MHT

    delphi 保存网页MHT   uses ADODB_TLB, CDO_TLB, ComObj,MSHTML;{$R *.dfm}{能把网页如 WWW.QQ.COM保存为一个单文件 .MHT但不能把 ...

  2. [ES6] 16. Object Enhancements

    Define object: var color = "blue"; var speed = 120; var car = {color, speed}; console.log( ...

  3. iOS开发——实用篇&KVO与KVC详解

    KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...

  4. 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2

    ----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...

  5. 项目源码--Android基于LBS地理位置信息应用的客户端

    下载源码 技术要点: 1. LBS应用框架客户端实现 2. 登录与注册系统 3. TAB类型UI实现 4. HTTP通信模块 5. 源码带详细的中文注释 ...... 详细介绍: 1. LBS应用框架 ...

  6. The 7 Stages Of Scaling Web Apps--reference

    reference from:http://highscalability.com/7-stages-scaling-web-apps TUESDAY, SEPTEMBER 23, 2008 AT 4 ...

  7. Skip list--reference wiki

    In computer science, a skip list is a data structure that allows fast search within an ordered seque ...

  8. centos中samba配置后始终连不上的绝招

    奶奶的,按照网上的办法改了/etc/samba/smb.conf配置文件,结果在win7里面死活连不上,后来发现是防火墙的问题. 有两个命令必须要执行: 1.将SELIUNX设置成disabled或者 ...

  9. 从 Auto Layout 的布局算法谈性能

    这是使用 ASDK 性能调优系列的第二篇文章,前一篇文章中讲到了如何提升 iOS 应用的渲染性能,你可以点击 这里 了解这部分的内容. http://t.cn/Rc4KbUC 在上一篇文章中,我们提到 ...

  10. C笔记01:关于printf函数输出先后顺序的讲解

    关于printf函数输出先后顺序的讲解!! 对于printf函数printf("%d%d\n", a, b);函数的实际输出顺序是这样的先计算出b,然后再计算a,接着输出a,最后再 ...