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

在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入
输入存在多组测试数据,对于每组测试数据:
输入两行6个字符表示当前的局面
输出
对于每组测试数据输出一个整数表示答案

解题思路:

fir//表示最开始的情况
tem//上一步的情况
now//表示现在的情况

为了避免避免出现重复的形况而无限循环无结果的情况,我们可以用一个vis数组用来标记,只要我们标记A,B,空格的位置标示这个情况已经出现过,以后就不会出现同样的情况了。
在这里由于要读入空格,我们用gets来读入。
以下两种读入的方法遇到空格都会停下来。

char s[5][5];
scanf("%s",s[0]);
cin>>s[0];

如果现在的情况的空格位置与上一步的A的位置相同,那么现在的情况的A位置应该是上一步的空格位置,同理,如果现在的情况的空格位置与上一步的B的位置相同,那么现在的情况的B位置应该是上一步的空格位置,代码如下:

             if (xx==tem.ax && yy==tem.ay){now.ax = tem.kx;now.ay = tem.ky;}else{now.ax = tem.ax;now.ay = tem.ay;}if (xx==tem.bx && yy==tem.by){now.bx = tem.kx;now.by = tem.ky;}else{now.bx = tem.bx;now.by = tem.by;}

终止条件便是现在的A的坐标与最开始的B坐标相同,现在的B坐标与最开始的A坐标相同

if (now.ax== fir.bx && now.ay==fir.by && now.bx==fir.ax && now.by==fir.ay)

在这道题中,之所以要到最后面才开始检查有没有这种情况出现,是因为要走过才能得到这种情况是什么样子的。不然你vis[now.ax][now.ay][now.bx][now.by][now.kx][now.ky]里面的now.ax,now.ay的值怎么得到。

代码如下:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 8;
char s[N][N];
bool vis[N][N][N][N][N][N];
int dx[] = {0,0,1,-1},dy[] = {1,-1,0,0};
struct node
{int ax,ay,bx,by,kx,ky,step;
};int bfs(node fir)
{memset(vis,0,sizeof(vis));queue<node>q;fir.step = 0;vis[fir.ax][fir.ay][fir.bx][fir.by][fir.kx][fir.ky] = true;q.push(fir);while(q.size()){node tem = q.front();q.pop();for (int i = 0;i<4;i++){int xx = tem.kx+dx[i],yy = tem.ky+dy[i];if (xx >= 0 && xx <2 && yy >= 0 && yy <3){node now;now.kx = xx;now.ky = yy;now.step = tem.step+1;if (xx==tem.ax && yy==tem.ay){now.ax = tem.kx;now.ay = tem.ky;}else{now.ax = tem.ax;now.ay = tem.ay;}if (xx==tem.bx && yy==tem.by){now.bx = tem.kx;now.by = tem.ky;}else{now.bx = tem.bx;now.by = tem.by;}if (now.ax== fir.bx && now.ay==fir.by && now.bx==fir.ax && now.by==fir.ay){return now.step;}if (vis[now.ax][now.ay][now.bx][now.by][now.kx][now.ky]==0){vis[now.ax][now.ay][now.bx][now.by][now.kx][now.ky] = true;q.push(now);}}}}return -1;
}int main()
{while(gets(s[0])!=NULL){gets(s[1]);node fir;for (int i = 0;i<2;i++)for (int j = 0;j<3;j++){if (s[i][j]=='A'){fir.ax = i;fir.ay = j;}else if (s[i][j]=='B'){fir.bx = i;fir.by = j;}else if (s[i][j]==' '){fir.kx = i;fir.ky = j;}}cout<<bfs(fir)<<endl;}return 0;
}

[蓝桥杯2016初赛]卡片换位-bfs相关推荐

  1. [蓝桥杯2016初赛]卡片换位 bfs+set

    你玩过华容道的游戏吗?这是个类似的,但更简单的游戏.看下面 3 x 2 的格子 +---+---+---+ | A | * | * | +---+---+---+ | B | | * | +---+- ...

  2. 蓝桥杯2016初赛python题解

    前言:除特殊说明外题解均可AC 蓝桥杯2016初赛 [蓝桥杯2016初赛]网友年龄 [蓝桥杯2016初赛]生日蜡烛 [蓝桥杯2016初赛]方格填数 [蓝桥杯2016初赛]寒假作业 [蓝桥杯2016初赛 ...

  3. 蓝桥杯取球博弈c语言算法,1298: [蓝桥杯2016初赛]取球博弈 (博弈)

    1298: [蓝桥杯2016初赛]取球博弈 (博弈) 1298: [蓝桥杯2016初赛]取球博弈 (博弈) #include #include #include #include #include # ...

  4. [蓝桥杯2016初赛]方格填数-next_permutation

    代码如下: #include <iostream> #include <algorithm> using namespace std;int main() {int a[10] ...

  5. [蓝桥杯2018初赛]全球变暖-dfs,bfs,连通块

    解题思路: bfs:遍历所有未遍历过的陆地,通过bfs计算出当前位置连通陆地的数量cnt,以及被淹没陆地的数量bound,若cnt == bound表示完整淹没的一个岛屿 dfs:将连通块全部标记,如 ...

  6. [蓝桥杯2016初赛]密码脱落

    题目描述 X星球的考古学家发现了一批古代留下来的密码.这些密码是由A.B.C.D 四种植物的种子串成的序列. 仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串). 由于年代久远,其中 ...

  7. [蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)

    题目描述 如下图, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连) 比如,下面两张图中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不 ...

  8. [蓝桥杯2016初赛]煤球数目-找规律

    题目描述 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), - 如果一共有100层,共有多少个煤球? 输出 ...

  9. [蓝桥杯2016初赛]交换瓶子

    题目描述 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子:2 1 3 5 4,要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为:1 2 3 4 5 对于这么简单的情况 ...

最新文章

  1. Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usin
  2. javascript 对象详解
  3. [家里蹲大学数学杂志]第427期与反对称矩阵有关的一个行列式
  4. docker可以把应用及其相关的_Docker相关命令应用
  5. yii框架安装及环境配置!!!
  6. 每日程序C语言7-将一个正整数分解质因数
  7. sqlserver 事务日志 异常增长原因排查_小白入门学习打日志
  8. java矩阵连乘算法_使用java写的矩阵乘法实例(Strassen算法)
  9. sed以及awk的替换命令
  10. java拆分任意五位数_五位数拆分出各位 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. 7.16模块及软件开发目录规范
  12. Java 核心五个类(File、Outputstream、Inputstream、Reader、Writer)一个接口(Serializable)...
  13. win8平板App-文件上传
  14. 服务器虚拟机的关键特性,VMware Workstation的几大关键特性
  15. 【项目管理一点通】(48) 项目结项
  16. jeb java_jeb2 java 脚本插件
  17. c语言表白情书作品,程序员一句话表白情书
  18. 秃如其来第一步之安装JDK
  19. 脸上8部位长痘原因与器官关系
  20. 快排 找第k大的数字

热门文章

  1. C语言试题二之计算并输出下列多项式值s=1+1/(1+2)+1/(1+2+3)+..1/(1+2+3…+50)
  2. Android之提示androidx.recyclerview.widget.LinearLayoutManager@51ddcd is already attached to a RecyclerV
  3. Android之GridLayoutManager.setSpanSizeLookup问题
  4. python 虚拟环境原理_Python 虚拟环境
  5. redhat yum 安装 mysql_Redhat 7 下Mysql8.0.19安装配置图文详解(配合使用 centos YUM源)...
  6. 当女朋友生气了而你却没发现 !!!
  7. 一厕难求!NASA悬赏三万五千美元,只为一个能在月球上用的马桶
  8. 现在女生的床真的都是这样吗?
  9. 每日一笑 | 为什么Python比Java更受欢迎?
  10. 催人泪下!一个程序员的悲惨故事