题目描述

你玩过华容道的游戏吗?这是个类似的,但更简单的游戏。看下面 3 x 2 的格子

    +---+---+---+
| 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--蓝桥杯卡片换位的更多相关文章

  1. 蓝桥杯 卡片换位(bfs)

    卡片换位 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵.还有一个格子是空着的. 你可以把一张牌移动到相邻的空 ...

  2. 算法竞赛——BFS广度优先搜索

    BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...

  3. 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想

    dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...

  4. BFS广度优先搜索 poj1915

    Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...

  5. 图的遍历BFS广度优先搜索

    图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...

  6. GraphMatrix::BFS广度优先搜索

    查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...

  7. 步步为营(十六)搜索(二)BFS 广度优先搜索

    上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...

  8. 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

  9. 关于宽搜BFS广度优先搜索的那点事

    以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...

随机推荐

  1. Java程序员必备:异常的十个关键知识点

    前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...

  2. 将Samba设置为Active Directory域控制器

    一 简介 从版本4.0开始,samba可以作为Active Directory(AD)域控制器(DC)运行,如果在生产环境中安装samba,建议运行两个或者多个DC用于故障转移 本文介绍如何让将一个S ...

  3. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  4. 【题解】P4503 [CTSC2014]企鹅QQ(哈希)

    [题解]P4503 [CTSC2014]企鹅QQ(哈希) 考虑这样一种做法,将每个字符串的删去某个字符的新字符串的哈希值存下来,然后最后\(sort\)一遍双指针统计每个值相同的数的个数\(x\),这 ...

  5. Linux系统之运行状态分析及问题排查思路

    〇.一件事儿 以下分析是站在Java工程师的角度来分析的. 一.CPU分析 分析CPU的繁忙程度,两个指标:系统负载和CPU利用率 1.系统负载分析 系统负载:在Linux系统中表示,一段时间内正在执 ...

  6. 小小知识点(三十九) 正交频分复用OFDM的基本原理及实现

    引言 符号间干扰(ISI)是无线传输系统设计中需要考虑的因素,采用什么样的处理方法取决于数据传输速率或等效传输带宽来决定 (1)若数据速率低且与信道最大延迟相比符号持续时间较长,那么就可能无需任何均衡 ...

  7. linux入门系列4--vi/vim编辑器

    上一篇文章"linux入门系列3--linux远程登陆工具"讲解了如何使用常用的工具远程连接和管理linux服务器,要管理服务器必然会涉及到脚本文件的创建.编辑工作,因此在介绍命令 ...

  8. linux下压缩包的解压

    linux下 最常见的是 .tar.gz 包和.tar.bz2包 .tar.gz格式的压缩包解压命令是:          tar   -zxvf   xx.tar.gz .tar.bz2格式的压缩包 ...

  9. Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)

    题意 ​ 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青 ...

  10. 一个DNS数据包的惊险之旅

    踏上旅程 “小子,快去查一下www.paypal.com的IP地址,我急用,晚了我弄你!”,暴躁老哥一把关上了门,留我一个DNS数据包在冷冰冰的房间. 过了一会儿,一位大叔打开了门,带着我来到了一座叫 ...