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 ;
}

最新文章

  1. ERP软件的价格设计
  2. USB Keyboard Recorder
  3. jQuery可拖拽排序列表jquery-sortable-lists
  4. iOS中编写单例类的心得
  5. Android 7.0 UICC 分析(一)
  6. 大话设计模式C++版——装饰模式
  7. Java网络应用编程
  8. 黄聪:MySQL 按指定字段自定义列表排序
  9. Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]
  10. C++库大全(转)
  11. 利用Unicode属性移除文本中的标点符号
  12. 类型检测汇总!typeof 和 instanceof 和isArray
  13. cryptopp开源库的使用(二):base64加密
  14. 本地存储-webStorage
  15. Sherlock and Squares
  16. 关于【IE兼容】的都在这
  17. office------------word邮件合并(word2016版)
  18. org/eclipse/jetty/server/Handler : Unsupported major.minor version 52.0
  19. jQuery 动态绑定插件livequery的用法
  20. YOLT:将YOLO用于卫星图像目标检测

热门文章

  1. 查看jvm常用命令
  2. iOS开发-多台机器共用证书问题
  3. 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)(转)
  4. Kconfig SourceCode GDB调试 *****
  5. nginx开发(二)配置mp4文件在线播放
  6. sql2000数据库置疑造成的原因以及如何解决置疑
  7. 手机访问PC网站自动跳转到手机网站代码
  8. 10.16NOIP模拟赛
  9. 在CentOS下安装VMware tool
  10. sqlalchemy配置多读写库多连接后的关系设置