蓝桥杯 卡片换位(bfs)
卡片换位
你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子

在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式:
输入两行6个字符表示当前的局面
输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
例如,输入:
程序应该输出:
17
再例如,输入:
程序应该输出:
12
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
解题过程:
这道题一开始用bfs的时候发现结果怎么也不对,找了很久发现自己写的是其他字符位置不变,只是A和B互换位置为bfs的返回条件。
之后看了一下题,发现A和B互换位置即可,其他字符的位置随便怎么样都行。。 所以以后做题的时候一定要认真审题,不要急躁。
思路:用一个string保存每一个局面的状态,图中的数字表示string的下标i,当i-1,i+1,i-3,i+3分别表示向左,向右,向上,向下走。使用set对该局面(string)进行判重。
但是注意到用如下的图有限制,比如3-1 = 2,但是3和2并不相邻。

所以将每一个局面的状态的保存修改为如下string,string的下标3不使用(代码中将其赋予了#),此时i-1,i+1,i-4,i+4分别表示向左,向右,向上,向下走,这样就消除了边界的影响。

#include<iostream>
#include<string>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stdio.h> using namespace std; int dx[] = {,-,,-}; string start_str;
int orig_posA;
int orig_posB; struct node
{
int x; // 空格字符所在的下标
string str;
int step;
}; void bfs(node nod)
{
queue<node> Q;
Q.push(nod);
set<string> sset;
sset.insert(nod.str); node t, p;
while(!Q.empty())
{
t = Q.front();
Q.pop(); /* 一开始把判断条件错误地写成了 if(t.str == end_str), end_str表示把
初始字符串中A,B位置互换后的字符串, 但是这样也把其他字符的位置固定死了 */
// 正解:A和B的位置与一开始的位置互换即可,其他字符的位置随意
if(t.str.find('B') == orig_posA && t.str.find('A') == orig_posB)
{
cout << t.step << endl;
return;
} for(int i = ; i < ; ++i)
{
int xx = t.x + dx[i];
if((xx >= && xx <= ) || (xx >= && xx <= ))
{
string ss = t.str;
swap(ss[t.x], ss[xx]);
p.x = xx;
p.str = ss;
p.step = t.step + ;
if(sset.count(p.str) == )
{
sset.insert(p.str);
Q.push(p);
} }
}
} } int main()
{
string s1;
string s2;
getline(cin, s1);
getline(cin, s2); // 下标3不使用,此处将其赋值为了#
start_str = s1 + '#' + s2; int start_x = start_str.find(' ');
orig_posA = start_str.find('A');
orig_posB = start_str.find('B'); node nod;
nod.x = start_x;
nod.str = start_str;
nod.step = ;
bfs(nod); return ;
}
蓝桥杯 卡片换位(bfs)的更多相关文章
- [蓝桥杯2016初赛]卡片换位 BFS
题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...
- BFS(广度优先搜索华容道游戏)--11--BFS--蓝桥杯卡片换位
题目描述 你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | + ...
- 蓝桥杯 穿越雷区(bfs)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- java实现第七届蓝桥杯棋子换位
棋子换位 棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行. 它们中间隔着一个空位,用"."表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置. 移动棋子的规则 ...
- 蓝桥杯 调手表(bfs解法)
小明买了块高端大气上档次的电子手表,他正准备调时间呢. 在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟. 大家都知道,手表只有一个按钮可以把当前的数加一.在调分钟的时 ...
- 蓝桥杯比赛关于 BFS 算法总结方法以及套路分析
首先我们来看几道java A组的题目,都是同一年的哦!!! 搭积木 小明最近喜欢搭数字积木,一共有10块积木,每个积木上有一个数字,0~9. 搭积木规则:每个积木放到其它两个积木的上面,并且一定比下面 ...
- 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
Description 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的 ...
- 蓝桥杯---剪格子(DFS&BFS)(小总结)
问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...
- 蓝桥杯 历届试题 约数倍数选卡片 (经典数论+DFS)
闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数.例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可 ...
随机推荐
- redis3.2.10单实例安装测试
redis3.2.10单实例安装测试 主要是实际使用环境中使用,为了方便快速部署,特意记录如下: # root用户 yum -y install make gcc-c++ cmake bison-de ...
- 重装了Devexpress后项目报Dll引用找不到问题解决办法
最近将我的开发环境从VS2015升级到VS2017,升级完后报如下错误,找不到Dev的引用,明明是重新装了dev为什么找不到呢? 经过查看dll引用地址,发现我的dev一开始是安装在C盘,dll引用路 ...
- 策略模式-Strategy(Java实现)
策略模式-Strategy 在策略模式中,一个类(策略使用者)可以更改自己的执行策略. 比如以排序算法为例子, 多种排序算法都归属于排序算法, 但是实现的算法细节不同, 使用者可以很轻松地替换策略, ...
- linux路由表
Linux 内核的路由表通过 route 命令查看 Linux 内核的路由表: [root@VM_139_74_centos ~]# routeKernel IP routing tableDesti ...
- 为什么ArrayList、LinkedList线程不安全,Vector线程安全
ArrayList源码 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! ele ...
- word20161229
1. launch 英[lɔ:ntʃ]美[lɔntʃ, lɑntʃ]vt. 发射; 发动; [计算机]开始(应用程序); 开展(活动.计划等);vi. 投入; 着手进行; 热衷于…;n. 投掷; 大船 ...
- python - Excel表格
from openpyxl import load_workbook wb = load_workbook(r'C:\Users\admin\Desktop\数据筛选.xlsx') # print(w ...
- CNN的反向传播
在一般的全联接神经网络中,我们通过反向传播算法计算参数的导数.BP 算法本质上可以认为是链式法则在矩阵求导上的运用.但 CNN 中的卷积操作则不再是全联接的形式,因此 CNN 的 BP 算法需要在原始 ...
- RNN回归
import torch from torch import nn import numpy as np import matplotlib.pyplot as plt # torch.manual_ ...
- json中的json.dumps()
Json简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - ...