http://acm.split.hdu.edu.cn/showproblem.php?pid=1043

刚开始一脸蒙逼,看了题解之后,参考了A*算法。

参考:http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html

还用到了变进制Hash全排列来判断结果是否满足条件。

参考:http://www.chinaunix.net/old_jh/23/1283459.html

第一次接触A*,感觉类似BFS,不同的是它可以更快地找到最优解。

最后要注意路径的保存,最终用dfs的printff输出。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdio>
#define MAX 322560
using namespace std; struct Node
{
int a[],g,h,num,Hash;
friend bool operator<(const Node x,const Node y)
{
return x.h+x.g>y.h+y.g;
}
}start; int HASH[]={,,,,,,,,};
int vis[],pre[],dis[] = {-,-,,};
int a[][]; int get_Hash(Node x)
{
int ans = ;
for(int i = ;i < ;i++)
{
int k = ;
for(int j =;j <i;j++)
{
if(x.a[j]>x.a[i]) k++;
}
ans += HASH[i]*k;
}
return ans;
} int get_h(Node x)
{ //»ñµÃ¹À¼Ûº¯ÊýH
int ans=;
for(int i=;i<;i++)
{
if(x.a[i] == ) continue;
ans += abs(i/-(x.a[i]-)/)+abs(i%-(x.a[i]-)%);
}
return ans;
} void printff(int h)
{
if(pre[h] == -) return;
printff(pre[h]);
switch (vis[h])
{
case : printf("u");
break;
case : printf("l");
break;
case : printf("d");
break;
case : printf("r");
break;
}
}
int main()
{
char str[];
while(gets(str))
{
memset(vis,-,sizeof(vis));
memset(pre,-,sizeof(pre));
int now = ,num = ;
for(int i = ;i < ;i++)
{
for(int j = ;j < ;j++,now++)
{
if(str[now] >= '' && str[now] <= '')
{
start.a[num++] = str[now]-'';
}
else if(str[now] == 'x')
{
start.num = num;
start.a[num++] = ;
}
else j--;
}
} num = ;
for(int i = ;i < ;i++)
{
for(int j = i+;j <;j++)
{
if(start.a[i] && start.a[j] && start.a[i]>start.a[j]) num++;
}
}
if(num%)
{
printf("unsolvable\n");
continue;
}
start.Hash = get_Hash(start);
if(start.Hash == MAX)
{
printf("\n");
continue;
}
start.g = ;
start.h = get_h(start);
vis[start.Hash] = -;
priority_queue<Node> q;
q.push(start);
while(!q.empty())
{
Node temp = q.top();
int xx = temp.num/,yy = temp.num%;
q.pop();
for(int i = ;i < ;i++)
{
Node x = temp;
x.num += dis[i];
if(yy == && i == ) continue;
if(yy == && i == ) continue;
if(x.num < || x.num > ) continue;
swap(x.a[x.num],x.a[temp.num]);
x.Hash = get_Hash(x);
if(vis[x.Hash] != -) continue;
x.g++;
x.h = get_h(x);
q.push(x);
pre[x.Hash] = temp.Hash;
vis[x.Hash] = i;
if(x.Hash == MAX) goto there;
}
}
there:
printff(MAX);
printf("\n");
}
}

HDU_1175_A*的更多相关文章

随机推荐

  1. mybatis两种方式

    // 1.传统的使用 statementId方式 //获取详情 sysApiDocumentMode = template.selectOne("oaApiDocument.getProje ...

  2. nginx负载均衡动态自动更新(微博开源模块nginx-upsync-module使用)

    这几天项目有个需求:负载要求能根据节点健康状态动态的增减.nginx自带的upstram已经很强大,而且基于Nginx Upstream配置动态更新已经有很多开源方案,大多数都是基于生成配置文件后进行 ...

  3. .Net Core Web Api实践(四)填坑连接Redis时Timeout performing EVAL

    前言:前两篇文章.net core+Redis+IIS+nginx实现Session共享中,介绍了使用Microsoft.Extensions.Caching.Redis实现Session共享的方法, ...

  4. DFS——深度优先搜索的一般格式

    DFS是一种深度优先的搜索思想,运用递归完成搜索,本质上也算是穷举思想的一类,可以通过剪枝进行优化. DFS的核心是回溯和递归, 如果以迷宫为例,一般会指定走各个方向的顺序(例如先左再上再右再下).从 ...

  5. Activiti接受任务(receiveTask)

    Activiti接受任务(receiveTask) 作者:Jesai 前言: Activiti接受任务(receiveTask)其实和Activiti的手动任务是差不多的,不过手动任务是直接通过,而A ...

  6. docker安装的gitlab的备份与恢复

    1.对docker容器安装gitlab备份 1) 查看容器id docker ps 2) 将容器备份成镜像文件 docker commit -a 'James' -m 'gitlab_backup' ...

  7. 4.JavaSE之标识符

    标识符:Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关键字:abstract.assert.boolean.breake.public.static.class...

  8. 开始使用Manjaro

    Manjaro是什么? 一个基于Arch系列,开源的linux发行版 Mnajrao官网了解更多,这里不做更多阐述内容 为什么使用Manjaro 第一点,为了方便自己隔离腾讯网游 第二点,更方便的学习 ...

  9. MyBatis5——Mybatis整合log4j、延迟加载

    开启日志:Log4j (1)加入jar包 (2)在conf.xml中配置开启日志: <settings>         <!-- 开启日志,并指定要使用的具体日志为log4j -- ...

  10. copy and swap技巧与移动赋值操作符

    最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun ...