BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位
题目描述
+---+---+---+
| A | * | * |
+---+---+---+
| B | | * |
+---+---+---+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入
输入两行6个字符表示当前的局面
输出
样例输入 Copy
* A
**B
A B
***
样例输出 Copy
17
12 分析:
1.此题时时刻刻抓住A、B、空格这三个点的位置,知道这三个点的位置等于知道整张图,通过sig数组来记录三点的行和列位置,从而记录整张图
2.BFS的起点是空格,后面遍历也是空格,遍历到哪儿,空格就在哪儿
3.向空格上下左右遍历,如遇到A点或B点,需交换空格与A点、B点的位置,也就是更新空格,A点,B点三点的位置。
4.遍历需要记录图的时时情况的,如果情况重复则不进行下去,如果此图的情况未出现过才进行
5.直到A、B两点位置交换的图的情况出现终止,并输出步数
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <cstdio>
#include <iomanip>
using namespace std; const int ROW = ;
const int COL = ;
char matrix[ROW][COL];
int arow,brow,acol,bcol,row,col;
int dd[][] = {,,,-,,,-,};
int sig[ROW][COL][ROW][COL][ROW][COL]; struct Node {
int i,j;
int ai,aj;
int bi,bj;
int step;
}; void bfs() {
queue<Node> q;
Node now;
now.i = row;
now.j = col;
now.ai = arow;now.aj = acol;
now.bi = brow;now.bj = bcol;
now.step = ;
q.push(now);
while (!q.empty()) {
now = q.front();
q.pop();
if(sig[now.ai][now.aj][now.bi][now.bj][now.i][now.j] == )
continue;
sig[now.ai][now.aj][now.bi][now.bj][now.i][now.j] = ;
if(now.ai == brow && now.aj == bcol && now.bi == arow && now.bj == acol ) {
cout<< now.step <<endl;
return ;
}
for (int i = ;i < ;i++) {
int ii = now.i + dd[i][];
int jj = now.j + dd[i][];
if (ii < || ii >= ROW || jj < || jj >= COL)
continue;
Node zz = now;
zz.i = ii;zz.j = jj;
zz.step++;
if (ii == now.ai && jj == now.aj) {
zz.aj = now.j;
zz.ai = now.i;
}
if (ii == now.bi && jj == now.bj) {
zz.bj = now.j;
zz.bi = now.i;
}
if (sig[zz.ai][zz.aj][zz.bi][zz.bj][zz.i][zz.j])
continue;
q.push(zz);
}
}
} int main() {
while (gets(matrix[]) != NULL ) {
gets(matrix[]);
memset(sig,, sizeof(sig));
for (int i = ; i < ROW; i++) {
for (int j = ; j < COL; j++) {
if (matrix[i][j] == ' ') {
row = i;
col = j;
}
if (matrix[i][j] == 'A') {
arow = i;
acol = j;
}
if (matrix[i][j] == 'B') {
brow = i;
bcol = j;
}
}
}
bfs();
}
return ;
}
BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位的更多相关文章
- 蓝桥杯 卡片换位(bfs)
卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- 图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...
- GraphMatrix::BFS广度优先搜索
查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...
- 步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...
- 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
随机推荐
- Centos7源码编译安装mysql8
前面介绍了很多关于mysql的文章,下面主要介绍一下mysql8的源码编译安装 一 基本环境 [root@CentOS-7-x86-64-Minimal-1810 ~]# cd /usr/local/ ...
- 不懂Neo4j?没关系,先学增删改查
从上篇文章中我们了解到了什么是Neo4j.为什么要用Neo4j.什么场景使用 以及怎么安装,如果您还不想熟悉,点击此处,传送过去哦~ 既然Neo4j是一个图数据库,那么毫无疑问,增删改查是必不可少的, ...
- 公子奇带你进入Java8流的世界(二)
在上一篇中我们带领大家简单的了解流的概念及使用场景,本节我们就来好好的介绍流的常见用法. 一.筛选和切片 对于一串流,我们有时需要取出我们需要的流中某些元素,主要是通过谓词筛选.看代码: 首先定义一个 ...
- 利用cuteftp上传并修改网站上内容
1.下载cuteftp 2.在host中输入网址(如:219.142.121.2) 3.username中输入(如:BNULS) 4.passpord中输入:(如410teamgood) 5.端口输入 ...
- 欧拉-拉格朗日方程 The Euler-Lagrange Equation
在 paper: Bounded Biharmonic Weights for Real-Time Deformation 中第一次接触到 Euler-Lagrange 方程,简单记录一下. 泛函的定 ...
- css label两端对齐
上面这种效果很常见,实现的代码如下: html部分 <ul> <li class="detail_item"> <span class="d ...
- VScode(一):C/C++ & MinGW & Code Runner
目录 1 VScode配置安装 2 MinGW配置安装 2.1 MinGW下载安装 2.2 MinGW环境配置 3 VScode编译C/C++ 3.1 扩展插件安装 3.2 项目配置 3.2.1 配置 ...
- OpenLayers4 隐藏(hide)Feature
需求: 需要将同一图层的要素进行分类显示和隐藏(类似于图层控制) 方法: 使用setStyle方法将Feature的样式设置为null. 环境: win10.google chrome.OL 4.3 ...
- Java之IO流用法总结
Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流( ...
- No property andp found for type String! Traversed path: CmsPage.siteId.
Respository没有找到该参数 1)由该参数,函数名写错,不符合JPA规范 2)实体类没有该参数