多校联合集训UESTC专场 HDU 3567 Eight II
(2010-08-25 19:41:23)
标签:
uestchdu3567eightiiit |
分类: 搜索 |
题目描述:
八数码问题,只是需要输出具体的变换方案,而且要其字典序最小。
解题报告:
大部分的八数码题目只是要输出最短的步数,即使要求输出方案也都是spj。
双向广搜和A*都可以很好的解决最短步数的问题。
但是字典序最小的话,单向按照字典序广搜可以得到答案,但是会超时。
(比赛时候我写的单广跑赛后官方数据要20s多,题目给了5s,不知道努力优化一把能不能过)
赛后写的双向广搜过了:
正向:直接按照dlru的顺序搜索就可以保证字典序。
反向:从末状态开始搜,如果搜到状态x
如果x状态没有被访问,那么访问它。
如果x状态已经访问了,(这里保证字典序最小的关键步骤)
那么找出原来的 从x状态到末状态的操作字符串
还有:
两者取一个最小的,使x的状态的前驱标记始终是最小的那个即可。
代码如下:116行
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
int move[2][4][2] = {{{1, 0}, {0, -1}, {0, 1}, {-1, 0}}, {{-1, 0},
{0, 1}, {0, -1}, {1, 0}}}, t;
char mv[4] = {'d', 'l', 'r', 'u'};
int pos[9][2] = {{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2},
{2, 0}, {2, 1}, {2, 2}};
int frc[10], vst[2][370000];
struct jeo
{
}que[2][370000];
void init()
{
}
int hash(char *str)//计算Hash值
{
}
string ans, ans0, ans1;
void getans0(int id)
{
}
void getans1(int id)
{
}
int main()
{