luoguP1379-八数码难题(双向bfs)
题目链接:https://www.luogu.org/problemnew/show/P1379
题意:用字符串表示八数码,求根据给定八数码得到末状态“123804765”最少的步数。
思路:这题很方便用双向bfs来优化,用两个队列分别从起点、终点开始搜索,两个map来记录该状态的步数。要注意的是起始状态和末状态相等的情况,需要特判。
AC代码:
#include<cstdio>
#include<queue>
#include<algorithm>
#include<string>
#include<map>
#include<iostream>
using namespace std; struct node{
string s;
int step,w;
}; int go[]={-,,-,};
queue<node> q1,q2;
map<string,int> mp1,mp2; bool isOK(int w,int k){
int x=w+go[k];
if(x<||x>) return false;
if(w%==&&k==) return false;
if(w%==&&k==) return false;
return true;
} void bfs(){
while(!q1.empty()&&!q2.empty()){
node now1=q1.front();q1.pop();
string s1=now1.s;
int step1=now1.step,w1=now1.w;
for(int i=;i<;++i){
if(!isOK(w1,i)) continue;
int ww=w1+go[i],st=step1+;
string ss=s1;
swap(ss[w1],ss[ww]);
if(mp1[ss]) continue;
if(mp2[ss]){
printf("%d\n",step1+mp2[ss]-);
return;
}
mp1[ss]=st;
node tmp={ss,st,ww};
q1.push(tmp);
} node now2=q2.front();q2.pop();
string s2=now2.s;
int step2=now2.step,w2=now2.w;
for(int i=;i<;++i){
if(!isOK(w2,i)) continue;
int ww=w2+go[i],st=step2+;
string ss=s2;
swap(ss[w2],ss[ww]);
if(mp2[ss]) continue;
if(mp1[ss]){
printf("%d\n",step2+mp1[ss]-);
return;
}
mp2[ss]=st;
node tmp={ss,st,ww};
q2.push(tmp);
}
}
} int main(){
string s;
cin>>s;
if(s==""){
printf("0\n");
return ;
}
int w;
for(int i=;i<s.length();++i)
if(s[i]==''){
w=i;break;
}
node bg={s,,w};
node ed={"",,};
mp1[s]=,mp2[""]=;
q1.push(bg),q2.push(ed);
bfs();
return ;
}
luoguP1379-八数码难题(双向bfs)的更多相关文章
- luoguP1379 八数码难题[启发式搜索]
		
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...
 - 【洛谷】P1379 八数码难题(bfs)
		
题目 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局 ...
 - HDOJ-1043 Eight(八数码问题+双向bfs+高效记录路径+康拓展开)
		
bfs搜索加记录路径 HDOJ-1043 主要思路就是使用双向广度优先搜索,找最短路径.然后记录路径,找到结果是打印出来. 使用康拓序列来来实现状态的映射. 打印路径推荐使用vector最后需要使用a ...
 - 八数码问题 双向BFS/Hsh链表存储
		
转自洛谷 作者EndSaH #include<iostream> #include<string> #include<cmath> #include<cstr ...
 - cdoj 414 八数码 (双向bfs+康拓展开,A*)
		
一道关乎人生完整的问题. DBFS的优越:避免了结点膨胀太多. 假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的. 分析:起始状态结点数为1,每加深一层,结点数An ...
 - 洛谷——P1379 八数码难题
		
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
 - 习题:八数码难题(双向BFS)
		
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
 - 双向广搜+hash+康托展开  codevs 1225 八数码难题
		
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
 - 「LuoguP1379」 八数码难题(迭代加深
		
[P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...
 - Codevs 1225 八数码难题
		
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
 
随机推荐
- React事件,修改this.state的值
			
1.React中绑定事件 React中绑定事件格式: onClick = { function } React中绑定事件的标准用法: import React from 'react' export ...
 - Linux帮助文档
			
Linux当中有许多命令: 在Linux中提供了详细的帮组文档,利用好可以提高使用效率: 1.help参数 大多数命令都可以使用 -h 或 --help 参数来获取该命令的使用方法.参数等信息: ...
 - codevs3269 混合背包 x
			
3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为 ...
 - 记一次zipkin和spring cloud bus冲突
			
问题表现spring boot 版本 2.0.6spring cloud 版本 Finchley.SR2 使用spring-cloud-starter-zipkin + 独立部署的zipkin 进行链 ...
 - echarts热力地图
			
<!DOCTYPE HTML> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml" ...
 - 【南工程开源计划】南京工程学院 信息与通信工程学院 课程设计说明书(论文) 宽带接入技术--WLAN接入设计
			
文章目录 蓝奏云文件存放地址 一.课程设计目的 二.课程设计要求 三.课程设计网络环境 四.课程设计内容 4.1 WLAN接入设计 4.1.1设计拓扑 4.1.2设计原理 1)WLAN 2)RADIU ...
 - Java Web Services面试
			
Q. 应用集成方式有哪些? A. 应用可以采用以下方式集成: 1. 共享数据库 2. 批量文件传输 3. 远程过程调用(RPC) 4. 通过消息中间件来交换异步信息(MOM) Q. 应用集成可以采用的 ...
 - EBS 创建会计科目 小结
			
1 创建会计科目 方式(以AP发票为例) 1)在发票工作台对单张发票进行创建科目: 参考网址: https://www.cnblogs.com/bruce_zhao/p/3809493.html 备注 ...
 - ccf 201612-3 权限查询
			
ccf 201612-3 权限查询 解题思路: 建立一个二维矩阵存储权限和角色 还差30分emmm #include<iostream> #include<cstring> ...
 - python全栈开发第6天
			
作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...