博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
阅读量:5079 次
发布时间:2019-06-12

本文共 3139 字,大约阅读时间需要 10 分钟。

【题目链接】:

【题意】

【题解】

从末状态的123456780开始逆向搜;
看它能到达哪些状态;
到时候O(1)输出就可以了;
用map< int,int> dic来判重;
对于状态;
用数组表示;
然后把它转化成一个对应的十进制数;
【Number Of WA
0
【完整代码】

#include 
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
pii;typedef pair
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 cs[9] = {
1,2,3,4,5,6,7,8,0};const double pi = acos(-1.0);const int N = 110;struct node{ int a[9],p,step;};node init;queue
dl;map
dic;int a[9];int has(int a[9]){ int x = 0; rep1(i,0,8) x = x*10 + a[i]; return x;}int main(){ //freopen("F:\\rush.txt","r",stdin); ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use rep1(i,0,8) init.a[i] = cs[i]; init.p = 8,init.step = 0; dl.push(init); dic[has(init.a)] = 0; while (!dl.empty()) { int p = dl.front().p; int now = dl.front().step; node temp; rep1(i,0,8) temp.a[i] = dl.front().a[i]; dl.pop(); //上 if (p>2) { int tp = p-3; swap(temp.a[tp],temp.a[p]); int xzt = has(temp.a); if (dic.find(xzt)==dic.end()) { dic[xzt] = now+1; temp.step = now+1; temp.p = tp; 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 (dic.find(xzt)==dic.end()) { dic[xzt] = now+1; temp.step = now+1; temp.p = tp; 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 (dic.find(xzt)==dic.end()) { dic[xzt] = now+1; temp.step = now+1; temp.p = tp; 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 (dic.find(xzt)==dic.end()) { dic[xzt] = now+1; temp.step = now+1; temp.p = tp; dl.push(temp); } swap(temp.a[tp],temp.a[p]); } } int t; cin >> t; while (t--) { rep1(i,0,8) cin >> a[i]; int zt = has(a); if (dic.find(zt)!=dic.end()) cout << dic[zt] << endl; else cout << "No Solution!" << endl; } return 0;}

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

你可能感兴趣的文章
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>
jQuery.form.js使用
查看>>
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
mysql数据增删改查
查看>>
shell中下载最新版本或指定版本的办法(Dockerfile 中通用)
查看>>