洛谷——P1379 八数码难题
2024-10-19 21:22:02
P1379 八数码难题
双向BFS
原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<map>
#include<cmath> using namespace std;
int g=,a[][],n;
int dx[]= {,,,-},
dy[]= {,-,,};
queue<int>Q;
map<int,int>v,ans; void slove() {
if(n==g) {
printf("");
exit();
}
Q.push(n),Q.push(g);//起始状态与终止状态同时入队
ans[n]=,ans[g]=;
v[g]=,v[n]=;
while(!Q.empty()) {
int now,cur=Q.front();
Q.pop();
now=cur;
int x,y;
for(int i=; i>=; i--)
for(int j=; j>=; j--) {
a[i][j]=now%,now/=;
if(!a[i][j]) x=i,y=j;
}
for(int i=; i<; i++) {
int tx=x+dx[i],ty=y+dy[i];
if(tx<||tx>||ty>||ty<) continue;
swap(a[tx][ty],a[x][y]);
now=;
for(int p=; p<=; p++)
for(int k=; k<=; k++)
now=now*+a[p][k];
if(v[now]==v[cur]) {
swap(a[tx][ty],a[x][y]);
continue;
}
if(v[now]+v[cur]==) {
printf("%d\n",ans[now]+ans[cur]);
exit();
}
ans[now]=ans[cur]+;
v[now]=v[cur];
Q.push(now);
swap(a[tx][ty],a[x][y]);
}
}
} int main() {
scanf("%d",&n);
slove();
return ;
}
最新文章
- ERP软件的价格设计
- USB Keyboard Recorder
- jQuery可拖拽排序列表jquery-sortable-lists
- iOS中编写单例类的心得
- Android 7.0 UICC 分析(一)
- 大话设计模式C++版——装饰模式
- Java网络应用编程
- 黄聪:MySQL 按指定字段自定义列表排序
- Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]
- C++库大全(转)
- 利用Unicode属性移除文本中的标点符号
- 类型检测汇总!typeof 和 instanceof 和isArray
- cryptopp开源库的使用(二):base64加密
- 本地存储-webStorage
- Sherlock and Squares
- 关于【IE兼容】的都在这
- office------------word邮件合并(word2016版)
- org/eclipse/jetty/server/Handler : Unsupported major.minor version 52.0
- jQuery 动态绑定插件livequery的用法
- YOLT:将YOLO用于卫星图像目标检测