// hdu 1491.cpp : 定义控制台应用程序的入口点。
/*
题目询问能否能从一个状态到另外一个状态而少于8步移动。
每个状态为4个不同的点,即8个坐标。由于从初始状态到目标状态,和目标状态到初始状态的效果是一样,所以可以采用双向广搜。
每次选取节点比较少的队列进行扩展,直到发生重合。
由于坐标的区间为[1,8],转化为[0,7]后,可用8进制进行状态压缩。最大的状态为8^8 - 1=16777215。在内存的限制内,事实上所有的状态只有
C(64,4)种,大概为635376种。
*/
#include "stdafx.h"
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
int dir[4][2] = {1,0,-1,0,0,1,0,-1};
int pow[] = {1,8,64,512,4096,32768,262144,2097152}; //8进制权值
char hash[18000000]; //当hash[i]的值为[0,8]时表示该状态是从起始状态扩展而来的移动步数
//当hash[i]的值为[10,18]时表示该状态是从目标状态扩展而来的移动步数
struct Point
{
int x;
int y;
};
struct State
{
Point p[4];
};
bool cmp(const struct Point& A, const struct Point &B)
{
if(A.x == B.x)
{
return A.y < B.y;
}
return A.x < B.x;
}
State s,e;
//8进制压缩状态
int getState(State& A)
{
sort(A.p,A.p+4,cmp);
int sum = 0;
for(int i=
hdu 1401 双向广搜+8进制压缩状态
最新推荐文章于 2024-08-02 21:48:33 发布
该博客通过双向广搜和8进制状态压缩的方法解决从一个状态到达另一个状态不超过8步的问题。利用C++实现,包括状态结构、8进制权值数组、哈希映射以及广搜算法,同时考虑了起点和终点的对称性。
摘要由CSDN通过智能技术生成