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 ...
 
随机推荐
- kafka笔记2
			
Kafka是使用java开发的程序,所以它可以运行在多种操作系统上,安装Kafka之前,需要先安装Java环境,再安装zookeeper broker常规配置 1.broker.id 每个broker ...
 - Windows新终端中玩转ASCII和Emoji游戏的正确姿势
			
Windows新终端中玩转ASCII和Emoji游戏的正确姿势 前一段时间,我搬运了几个Windows Terminal中玩游戏的视频,详情请看 发布在即!来一睹官方团队如何玩转 Windows Te ...
 - spring boot 2.x 系列 —— spring boot 整合 RabbitMQ
			
文章目录 一. 项目结构说明 二.关键依赖 三.公共模块(rabbitmq-common) 四.服务消费者(rabbitmq-consumer) 4.1 消息消费者配置 4.2 使用注解@Rabbit ...
 - 【Flink】深入理解Flink-On-Yarn模式
			
1. 前言 Flink提供了两种在yarn上运行的模式,分别为Session-Cluster和Per-Job-Cluster模式,本文分析两种模式及启动流程. 下图展示了Flink-On-Yarn模式 ...
 - usb口打印机的指令打印和驱动打印
			
打印机简介:是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上. 打印机类型:激光打印机.喷墨打印机.针式打印机.热敏打印机等. 计算机和打印机之间的连接方式:usb口.串口.并口.网口.蓝 ...
 - 学习kafka自己发生的几个小错误记录
			
一. The method iterator() is ambiguous ConsumerIterator<byte[],byte[]> it =stream.iterator(); ...
 - 我把代码开源、托管到了GitHub、码云
			
前言 学习了那么多知识点,写了那么多代码,一直都没有时间整理,之前都是新学一个知识点就在同一个工程项目中进行实践测试,导致这个工程越来越臃肿.越来越乱,连我自己都快看不懂了... 这段时间整理了部分代 ...
 - CSU 1804: 有向无环图(拓扑排序)
			
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在 ...
 - CodeForces 691D:Swaps in Permutation(并查集)
			
http://codeforces.com/contest/691/problem/D D. Swaps in Permutation You are given a permutation of ...
 - java获取config下文件
			
private static final String keystore="keystore.jks"; InputStream is=Thread.currentThread() ...