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++ 八数码问题宽搜的更多相关文章

  1. Eight hdu 1043 八数码问题 双搜

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. 【宽搜】Vijos P1360 八数码问题

    题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...

  3. 双向广搜+hash+康托展开 codevs 1225 八数码难题

    codevs 1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description Yours和zero在研究A*启 ...

  4. 【双向广搜+逆序数优化】【HDU1043】【八数码】

    HDU上的八数码 数据强的一B 首先:双向广搜 先处理正向搜索,再处理反向搜索,直至中途相遇 visit 和 队列都是独立的. 可以用一个过程来完成这2个操作,减少代码量.(一般还要个深度数组) 优化 ...

  5. 【洛谷P1379】八数码难题(广搜、A*)

    八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...

  6. ACM/ICPC 之 BFS-广搜进阶-八数码(经典)(POJ1077+HDU1043)

    八数码问题也称为九宫问题.(本想查查历史,结果发现居然没有词条= =,所谓的历史也就不了了之了) 在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个 ...

  7. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

  8. 八数码问题:C++广度搜索实现

    毕竟新手上路23333,有谬误还请指正. 课程设计遇到八数码问题(这也是一坨),也查过一些资料并不喜欢用类函数写感觉这样规模小些的问题没有必要,一开始用深度搜索却发现深搜会陷入无底洞,如果设定了深度限 ...

  9. hdu 1043 Eight 经典八数码问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 The 15-puzzle has been around for over 100 years ...

随机推荐

  1. Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现

    1.需求概括 我们知道,在SQL Server Alwayson 架构中,有多种虚拟IP,例如 WindowsCluster IP,ListenIP,角色高可用性IP(类似于侦听IP).在某些条件下, ...

  2. Spring Boot的学习之路(01):缘起

    有人说,Spring Boot的出现,让Java迎来了又一春,它是Java应用开发的颠覆者,彻底改变了Java应用开发的模式. 2017年,SpringBoot闯入我的生活, 也让我迎来了又一春 我开 ...

  3. WebGL场景的两种地面构造方法

    总述:大部分3D编程都涉及到地面元素,在场景中我们使用地面作为其他物体的承载基础,同时也用地面限制场景使用者的移动范围,还可以在通过设置地块的属性为场景的不同位置设置对应的计算规则.本文在WebGL平 ...

  4. 基于 HTML5 Canvas 的元素周期表展示

    前言 之前在网上看到别人写的有关元素周期表的文章,深深的勾起了一波回忆,记忆里初中时期背的“氢氦锂铍硼,碳氮氧氟氖,钠镁铝硅磷,硫氯氩钾钙”.“养(氧)龟(硅)铝铁盖(钙),哪(钠)家(钾)没(镁)青 ...

  5. Java学习笔记——设计模式之七.模板方法模式

    模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...

  6. Hive入门(二)分区

    1 基本概念 1.1 什么是分区 Hive查询中一般会扫描整个表内容,会消耗很多时间.有时候只需要查询表中的一部分数据,因此建表时引入了partition(分区)概念. 表中的一个 Partition ...

  7. 微信小程序社区爬取

    # CrawlSpider 需要使用:规则提取器 和 解析器 # 1. allow设置规则的方法:要能够限制在目标url上面, 不要跟其他的url产生相同的正则即可 # 2. 什么情况下使用follo ...

  8. 究竟什么是Windows句柄

    图解说明——究竟什么是Windows句柄     这里需要说明: 1.这里将句柄所能标识的所有东西(如窗口.文件.画笔等)统称为“对象”. 2.图中一个小横框表示一定大小的内存区域,并不代表一个字节, ...

  9. kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495

    题目链接:https://vjudge.net/problem/HDU-1495 题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两 ...

  10. java高并发系列-第1天:必须知道的几个概念

    java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...