C++ 八数码问题宽搜
C++ 八数码问题宽搜
题目描述

照片中表示的是从城市A到城市H的交通图。从图中可以看出,城市A到H要经过若干个城市。现在要找出一条经过城市最少的路线。
具体过程如下:
(1)讲城市A入队,队首为0,队尾为1
(2)将队首所指向的城市,所有可以直通的城市入队(如果这个城市在队列中出现过,就不入队,可以用一个布尔数组s[i]来判断),将入队城市的前趋城市保存在b[i]中,然后将队首加1,得到新的队首城市。重复以上步骤,知道搜到城市H时,搜索结束。利用b[i]可倒推出最少城市路线。
样例输入
(none)
样例输出
H--F--A
AC代码
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int ju[9][9] = {{0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,1,1},
{0,0,1,1,1,1,0,1,1},
{0,0,1,1,0,0,1,1,1},
{0,0,1,0,1,1,1,0,1},
{0,1,1,0,1,1,1,0,0},
{0,0,0,1,1,1,1,1,0},
{0,1,1,1,0,0,1,1,0},
{0,1,1,1,1,0,0,0,1}};//根据图来生成矩阵
int a[101],b[101];//a是经过的城市 b是记录前趋城市
bool s[9];//true为不可走 false为可走 为了避免重复
void out(int d)//作用是把数组按char输出
{
cout << char(a[d] + 'A' - 1);//将数字转换成字母 (一个数字 +'A'-1 (+64) 才是char)
while (b[d])//重复输出,直到没有前趋城市为止(达到起点)
{
d = b[d];
cout << "--" << char(a[d] + 'A' - 1);//后面的数字用"--"隔开
}
cout << endl;
}
void doit()
{
int head,tail,i;
head = 0;tail = 1;//head出队下标 tail入队下标
a[1] = 1;//a[]是现在经过的城市 把起点的城市放在队列的第一个数
b[1] = 0;//b[]保存入队城市的前趋城市 因为A没有前趋 所以为0
s[1] = 1;//s[]判断是否能走或是否被选择过 0是能或者没被选择 1是不能或者已被选择
///////////////////////////Start to BFS/////////////////////////////////////
do//重复执行直到出队下标 <= 入队下标 保证不越界 (head < tail)
{
head ++;//head是出队下标
for (i = 1;i <= 8;i ++)//每一行遍历8列的矩阵元素
{
if (ju[a[head]][i] == 0 && s[i] == 0)//如果这个城市可以走,并且以前没有入队,那就入队
{//s[]控制入队元素是否重复
tail ++;//入队下标 + 1
a[tail] = i;//入队都入队
b[tail] = head;
s[i] = 1;//把当前城市标为已经选择过
if (i == 8)//因为目标在第8列
{
out(tail);//输出函数 递归输出目标城市的前趋城市(即为起点到目标城市的最短路线)
head = tail;//
break;//直接退出
}
}
}
}while (head < tail);
}
int main()
{
// freopen("out.txt","w",stdout);
memset(s,false,sizeof(s));//把s下标里的元素全部初始化为False
doit();//调用
return 0;//
}


C++ 八数码问题宽搜的更多相关文章
- Eight hdu 1043 八数码问题 双搜
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 【宽搜】Vijos P1360 八数码问题
题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- 【双向广搜+逆序数优化】【HDU1043】【八数码】
HDU上的八数码 数据强的一B 首先:双向广搜 先处理正向搜索,再处理反向搜索,直至中途相遇 visit 和 队列都是独立的. 可以用一个过程来完成这2个操作,减少代码量.(一般还要个深度数组) 优化 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)
八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- 八数码问题:C++广度搜索实现
毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...
- hdu 1043 Eight 经典八数码问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...
随机推荐
- 条款10:令operator= 返回一个reference to *this
关于赋值,可以写成连锁形式: int x, y, z; x = y = z = 15; //赋值连锁形式 赋值采用右结合律,故上述赋值被解析为: x = (y = (z = 15)); 为了实现连锁赋 ...
- return view 详解 MVC
1.return View(); 返回值 类型:System.Web.Mvc.ViewResult将视图呈现给响应的 View() 结果. 注释 View() 类的此方法重载将返回一个具有空 View ...
- linux上java和golang环境变量的设置
JAVA环境变量 (1).打开~/.bashrc完成环境配置( 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效.) 文件追加 expo ...
- __file__、__name__、__dict__方法整理
本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...
- kubernetes client-go解析
注:本次使用的client-go版本为:client-go 11.0,主要参考CSDN上的深入浅出kubernetes之client-go系列,建议看本文前先参考该文档.本文档为CSDN文档的深挖和补 ...
- vue 开发webapp 手机返回键 退出问题
vue 开发webapp 手机返回键 退出问题 mui进行手机物理键的监听 首先安装 vue-awesome-mui npm i vue-awesome-mui 在main.js注册 在index.h ...
- 移动IM开发指南1:如何进行技术选型
<移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...
- 【设计模式】行为型09访问者模式(Visitor Pattern)
学习地址:https://blog.csdn.net/u012124438/article/details/70537203(参考了很多博客,只有这个讲明白了核心点) 访问者模式(Visitor P ...
- [Qt]自定义表头实现过滤功能
1. 写在前面 过滤功能源自项目上交互优化用户体验,在表头添加过滤符号实现过滤,替换以往在表格上方占用一行过滤项进行过滤. 2. 过滤提示 过滤提示就是三态图标(normal,hover,press) ...
- 《深入浅出RxJS》读书笔记
rxjs的引入 // 如果以这种方式导入rxjs,那么整个库都会导入,我们一般不可能在项目中运用到rxjs的所有功能 const Rx = require('rxjs'); 解决这个问题,可以使用深链 ...