【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)

【题目链接】:http://hihocoder.com/problemset/problem/1312?sid=1092363

【题意】

【题解】

定义一个A*函数
f = step+val
这里的val是当前这个状态;每个点到目标状态的点的曼哈顿距离的绝对值;
(这个值肯定比真正需要花费的路程短)
step就为当前状态花费的步数;
把普通队列改成优先队列;
优先处理f值小的状态;
f值相同的,优先处理step值小的;
(也就是说f值大的不是不处理了,而是放到后面再处理)
这样就能较快地逼近目标状态了;
效果异常地棒
2s变成0.2s了!

【Number Of WA

0

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)typedef pair<int,int> pii;
typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const int pre[9][2] =
{{2,2},{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1}
};
const double pi = acos(-1.0);
const int N = 110;struct node
{int a[9],p,step,f;friend bool operator < (node x,node y){if (x.f==y.f){if (x.step==y.step)return true;elsereturn x.step>y.step;}elsereturn x.f>y.f;}
};node init;
priority_queue <node> dl;
map <int,int> dic;
int a[9],goal;
int cs[9] = {1,2,3,4,5,6,7,8,0};int has(int *a)
{int x = 0;rep1(i,0,8) x = x*10 + a[i];return x;
}int val(int *a)
{int ret = 0;rep1(i,0,8){int x = i/3,y = i%3;if (a[i]==0) continue;ret+=abs(pre[a[i]][0]-x)+abs(pre[a[i]][1]-y);}return ret;
}int bfs()
{while (!dl.empty()){int p = dl.top().p;int now = dl.top().step;node temp;rep1(i,0,8) temp.a[i] = dl.top().a[i];dl.pop();//上if (p>2){int tp = p-3;swap(temp.a[tp],temp.a[p]);int xzt = has(temp.a);if (xzt==goal) return now+1;if (dic.find(xzt)==dic.end()){dic[xzt] = now+1;temp.step = now+1;temp.p = tp;temp.f = temp.step+val(temp.a);dl.push(temp);}swap(temp.a[tp],temp.a[p]);}//下if (p<6){int tp = p+3;swap(temp.a[tp],temp.a[p]);int xzt = has(temp.a);if (xzt==goal) return now+1;if (dic.find(xzt)==dic.end()){dic[xzt] = now+1;temp.step = now+1;temp.p = tp;temp.f = temp.step+val(temp.a);dl.push(temp);}swap(temp.a[tp],temp.a[p]);}//左if (p%3!=0){int tp = p-1;swap(temp.a[tp],temp.a[p]);int xzt = has(temp.a);if (xzt==goal) return now+1;if (dic.find(xzt)==dic.end()){dic[xzt] = now+1;temp.step = now+1;temp.p = tp;temp.f = temp.step+val(temp.a);dl.push(temp);}swap(temp.a[tp],temp.a[p]);}//右if (p%3!=2){int tp = p+1;swap(temp.a[tp],temp.a[p]);int xzt = has(temp.a);if (xzt==goal) return now+1;if (dic.find(xzt)==dic.end()){dic[xzt] = now+1;temp.step = now+1;temp.p = tp;temp.f = temp.step+val(temp.a);dl.push(temp);}swap(temp.a[tp],temp.a[p]);}}return -1;
}int main()
{//freopen("F:\\rush.txt","r",stdin);ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not usegoal = has(cs);int t;cin >> t;while (t--){dic.clear();rep1(i,0,8){cin >> a[i];if (a[i]==0) init.p = i;}rep1(i,0,8) init.a[i] = a[i];init.step = 0,init.f = init.step+val(init.a);dic[has(init.a)] = 0;if (has(init.a)==goal){cout << 0 << endl;continue;}while (!dl.empty()) dl.pop();dl.push(init);int ans = bfs();if (ans==-1)cout <<"No Solution!"<<endl;elsecout << ans << endl;}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626359.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gartner发布2020年数据与分析领域的十大技术趋势

来源&#xff1a;Gartner公司近日&#xff0c;Gartner发布了数据与分析领域的十大技术趋势&#xff0c;为数据和分析领导者的新冠疫情&#xff08;COVID-19&#xff09;响应和恢复工作提供指导&#xff0c;并为疫情后的重启做好准备。数据和分析领导者如果希望在疫情后能持续创…

java 中文域名转码_转换java方法

java date String 类型相互转换这种转换要用到java.text.SimpleDateFormat类字符串转换成日期类型&#xff1a;方法1&#xff1a;也是最简单的方法 Date datenew Date("2008-04-14");方法2&#xff1a;SimpleDateFormat sdfnew SimpleDateFormat("yyyy-M...文章…

【42.59%】【codeforces 602A】Two Bases

time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output After seeing the “ALL YOUR BASE ARE BELONG TO US” meme for the first time, numbers X and Y realised that they have different bases, which complic…

java2019 数据结构算法面试题_2019年JVM最新面试题,必须收藏它

1、JVN内存结构方法区和对是所有线程共享的内存区域&#xff1b;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域&#xff0c;在虚拟机启动时创建。此内存区域的唯一…

前沿科技 | 中科院科学家研究揭示灵活行动选择的神经机制

来源&#xff1a;中国科学院6月24日&#xff0c;中国科学院科学家团队——脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、上海脑科学与类脑研究中心、神经科学国家重点实验室姚海珊研究组在eLife上在线发表了题为《次级运动皮层在灵活视觉分类行为中参…

中科院调查组成立!杨辉发表声明,并对举报信作出详细回应

左&#xff1a;加州大学圣地亚哥分校教授付向东。右&#xff1a;中科院神经所青年 PI 杨辉。图片来源&#xff1a;UCSD/一席演讲来源 BioArtReports 中科院神经所 等整理 科研圈7 月 2 日&#xff0c;网络消息称加州大学圣地亚哥分校细胞和分子医学系教授付向东发布实名举报信&…

java lookandfeel nimbus_动态改变LookAndFeel

LookAndFeel可以改变图形界面的风格&#xff0c;比如说可以将Java的默认界面改变成仿Windows&#xff0c;UNIX等其它风格的界面&#xff0c;主要有以下几种界面风格&#xff1a;metal(默认):"javax.swing.plaf.metal.MetalLookAndFeel"windows:"com.sun.java.sw…

盘点华为系工控企业——中国A股上市公司最多的创业体系

来源&#xff1a;OFweek工控别看今日华为风光无限&#xff0c;美国举国打压下更显华为雄厚实力&#xff1b;但早在2000年左右&#xff0c;全球IT产业泡沫破灭&#xff0c;作为通信设备商&#xff0c;华为也受累进入寒冬&#xff0c;任正非为了鼓励团队士气&#xff0c;写出了著…

Java多线程编程递增_java多线程编程之简介

编写正确的程序很难&#xff0c;编写正确的多线程程序更难。如果对多线程理解的不够深入&#xff0c;编写出来的程序往往跟自己的预期不一样&#xff0c;甚至不知道问题出现在哪里。因此&#xff0c;如果想成为一个好的程序员&#xff0c;掌握多线程是必修的一门功课。多线程带…

JavaScript中的内置对象-8--4.date对象中-获取,设置日期时间的方法; 获取,设置年月日时分秒及星期的方法;...

学习目标 1.掌握创建日期对象的方法 2.掌握date对象中获取日期时间的方法 3.掌握date对象中设置日期时间的方法 如何创建一个日期对象 语法&#xff1a;new Date(); 功能&#xff1a;创建一个日期时间对象 返回值&#xff1a;比传参的情况下&#xff0c;返回当前的日期时间对象…

秦川团队《科学》刊发研究:新冠感染恒河猴康复后不会再感染

来源&#xff1a;澎湃新闻新冠病毒&#xff08;SARS-CoV-2&#xff09;肺炎疫情全球大流行的背景下&#xff0c;恢复期患者是否有再次感染的风险目前尚不清楚。来自中国的最新科研成果表明&#xff0c;原发性新冠病毒感染可防止随后再感染&#xff0c;这对新冠患者的预后和下一…

java禁止修改map_Java中实现不可变Map

有时最好不允许修改 java.util.Map&#xff0c; 例如跨线程共享只读数据。为此&#xff0c;我们可以使用Unmodifiable Map或Immutable Map。在这个快速教程中&#xff0c;我们将看到它们之间的区别。然后&#xff0c;我们将介绍可以创建不可变Map的各种方法。不可修改与不可变…

昨夜,5G R16标准正式冻结!5G物联网扬帆起航

作者&#xff1a;赵小飞物联网智库 整理发布转载请注明来源和出处导 读昨天夜里&#xff0c;负责5G标准的国际组织3GPP TSG&#xff03;88全体会议宣布5G R16标准冻结。在新冠疫情全球肆虐的背景下&#xff0c;标准化推进工作遇到非常大的挑战&#xff0c;而3GPP的专家们依然能…

Linux下grub.cnf详解

grub.conf跟系统启动项有关&#xff0c;对于重置密码。来说小case。。。 1、介绍 在Red Hat Linux7.2之后&#xff0c;默认的引导加载程序从LTLO变为GRUB.这个引导加载程序使用户能够选择何时以及如何引导安装在计算机硬盘上的可引导的操作系统。 2、说明 变量 说…

(二)用户相关操作

一、导入jar包 见 http://pan.baidu.com/s/1dE9kMJZ 二、导入c3p0并修改值 c3p0.driverClasscom.mysql.jdbc.Driver c3p0.jdbcUrljdbc:mysql://localhost:3306/store c3p0.userroot c3p0.password123456 三、导入工具类 见 http://pan.baidu.com/s/1miutJXe 有关这些工具类的分…

java配合ajax加快发展_配合JAVA的AJAX使用

概要Ajax是“Asynchronous JavaScript and XML”的简称&#xff0c;即异步的JavaScript和XML。readyState属性用来返回当前的请求状态&#xff0c;有五个可选值。分别是0到4&#xff0c;每个值的含义如下描述。 0&#xff1a;“未初始化”状态&#xff0c; 表示已经创建一个XML…

你以为美国商业航天那么牛只是因为马斯克?更多原因在这里!

来源&#xff1a;银河航天漫游指南2020年5月31日&#xff0c;SpaceX的载人龙飞船成功将两位宇航员成功送往国际空间站&#xff0c;成为有史以来第一家将人类送入太空轨道的私营企业。美国商业航天领域的进展有目共睹。载人龙飞船起飞瞬间这次成功发射打破了传统航天领域以国家力…

APP开发流程

https://wenku.baidu.com/view/04a51445c77da26924c5b058.html?fromsearch转载于:https://www.cnblogs.com/ada-openmind/p/7634453.html

java游戏应龙女魃转世_应龙和女魃的凄美爱情,究竟是爱情,还是阴谋?

人世间最痛苦的事情是什么&#xff1f;有人说是生老病死&#xff0c;也有人说是爱憎别离。对于她来说&#xff0c;或许最痛苦的是他的欺骗与背叛……女魃一、初见北荒往东二百里&#xff0c;有一座山&#xff0c;名唤玲珑山。山中住着一名神女&#xff0c;名为女魃。相传&#…

热点|因为AI不是人,美国专利局拒绝认定TA的所有发明权

来源&#xff1a;量子位「你不是人&#xff01;」——美国专利局&#xff08;USPTO&#xff09;。这句话是美国专利局&#xff0c;对所有人工智能说的。4月27日&#xff0c;美国专利局出台一项规定&#xff1a;对于任何由人工智能独立设计发明的产品&#xff0c;因为AI不是自然…