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. JavaScript数据类型 - Symbol

    ES5:对象的属性名只能是字符串,当给对象添加新属性时,很容易造成属性名冲突,从而覆盖了原有的属性. ES6:所以ES6中引入了symbol数据类型,他表示独一无二的值,避免了属性名的冲突,此时对象的 ...

  2. Mysql备份与恢复(1)---物理备份

    数据库对企业来说最重要的莫过于其中的数据,所以做好数据库的备份是一个不可或缺的工作.数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小 ...

  3. 阿里CTR预估:用户行为长序列建模

    本文将介绍Alibaba发表在KDD'19 的论文<Practice on Long Sequential User Behavior Modeling for Click-Through Ra ...

  4. swiper如何禁止左右箭头切换

    swiper做项目时,需求 带着左右两边的箭头, 场景1:swiper自动切换,此时左右箭头点击时不能切换   场景2:swiper手动切换,左右箭头可以实现切换,通过翻阅api 终于找到 <s ...

  5. linux入门系列7--管道符、重定向、环境变量

    前面文章我们学习了linux基础命令,如果将不同命令组合使用则可以成倍提高工作效率.本文将学习重定向.管道符.通配符.转义符.以及重要的环境变量相关知识,为后面的shell编程打下基础. 一.IO重定 ...

  6. 【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分

    为了更好的完善Magicodes.IE,春节期间我们会进行一次大的重构.由于精力有限,急缺文档和翻译(将文档翻译为英文文档)支持,诚邀各位加入.同时在功能方便也做了相关规划,有兴趣的朋友可以参与提交P ...

  7. FFT 入门

    推荐博客 :https://oi.men.ci/fft-notes/ 卷积的理解 : https://www.zhihu.com/question/22298352?rf=21686447 题目链接 ...

  8. js css html加载顺序

    1.js放在head中会立即执行,阻塞后续的资源下载与执行.因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控.正常的网页加载流程是这样的.浏览器一边下载HTML网页,一边开 ...

  9. Gitlab安装配置管理

    ◆安装Gitlab前系统预配置准备工作1.关闭firewalld防火墙# systemctl stop firewalld# systemctl disable firewalld 2.关闭SELIN ...

  10. git 查看修改账号密码

    git config user.name         查看用户名 git config user.email         查看用户邮箱 修改用户名和邮箱的命令 git config --glo ...