HDU 1043 Eight poj 1077 (八数码 启发式搜索)

该博客介绍了如何利用A*搜索算法解决八数码问题,分别针对HDU 1043和POJ 1077两道题目。在HDU的问题中,由于需要判断是否存在解以避免超时,而POJ的问题则不需要此步骤。博主还提到了一种奇偶判断解存在的方法,通过计算状态的逆序数来确定是否为偶数,从而判断状态是否可达。
摘要由CSDN通过智能技术生成

题目链接
poj1077
hdu1043

使用A*搜索就可以了
A*是bfs的一种优化,使用函数F做为每个节点的访问的优先级

hdu的需要先判断是否有解,否则会tle,加上后跑了1000+ms
poj的不用判断,也可以ac,跑了40+ms

奇偶判断解是否存在:

一个状态表示成一维的形式,求出除空白之外所有数字的逆序数之和,也就是每个数字前面比它大的数字的个数的和,称为这个状态的逆序。
若两个状态的逆序奇偶性 相同,则可相互到达,否则不可相互到达。
由于原始状态的逆序为0(偶数),则逆序为偶数的状态有解。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define fastIO ios::sync_with_stdio(false);cin.tie(0);
#define LL long long
#define pb push_back
#define gcd __gcd


#define For(i,j,k) for(int i=(j);i<=k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)

typedef vector<LL> vec;
typedef pair<int,int> PI;
const double EPS = 1e-8;
const int maxn = 4e5;
const int inf  = 1 << 28;
int fac[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值