题目:卡片换位

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

+---+---+---+
|  A |  *  |  *  |
+---+---+---+
|  B |     |  *  |
+---+---+---+

在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。

你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

输入格式:
输入两行6个字符表示当前的局面

输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)

例如,输入:
* A
**B

程序应该输出:
17

再例如,输入:
A B
***

程序应该输出:
12

思路:

状态的变化,求最小步数一般是使用bfs算法。将二维字符数组转化为一维字符串,然后进行判断处理。

package Java2016;import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;public class 卡片换位 {static String s;//初始状态static int posA;//A的位置static int posB;//B的位置static O posO;//空格的位置public static void main(String[] args) {Scanner sc=new Scanner(System.in);String s1=sc.nextLine();String s2=sc.nextLine();s=s1+s2;char[][] a=new char[2][3];for (int i = 0; i < a[0].length; i++) {a[0][i]=s1.charAt(i);}for (int i = 0; i < a[0].length; i++) {a[1][i]=s2.charAt(i);}posO=new O();for (int i = 0; i < a.length; i++) {for (int j = 0; j < a[0].length; j++) {if (a[i][j]=='A') {posA=3*i+j;}if (a[i][j]=='B') {posB=3*i+j;}if (a[i][j]==' ') {posO.i=i;posO.j=j;}}}bfs();}public static void bfs() {Queue<T> q=new LinkedList<T>();T t=new T(posO,s);HashSet<String> set=new HashSet<>();set.add(s);q.add(t);while(!q.isEmpty()) {T t1=q.poll();if (check(t1.s)) {System.out.println(t1.num);return;}int i=t1.x.i;int j=t1.x.j;if (i-1>=0) {int x1=(i-1)*3+j;int x2=i*3+j;String s1=swap(t1.s,x1,x2);if (set.add(s1)) {O o1=new O();o1.i=i-1;o1.j=j;T t2=new T(o1,s1);t2.num=t1.num+1;q.offer(t2);}}if (i+1<2) {int x1=(i+1)*3+j;int x2=i*3+j;String s1=swap(t1.s,x1,x2);if (set.add(s1)) {O o1=new O();o1.i=i+1;o1.j=j;T t2=new T(o1,s1);t2.num=t1.num+1;q.offer(t2);}}if (j-1>=0) {int x1=(i)*3+j-1;int x2=i*3+j;String s1=swap(t1.s,x1,x2);if (set.add(s1)) {O o1=new O();o1.i=i;o1.j=j-1;T t2=new T(o1,s1);t2.num=t1.num+1;q.offer(t2);}}if (j+1<3) {int x1=(i)*3+j+1;int x2=i*3+j;String s1=swap(t1.s,x1,x2);if (set.add(s1)) {O o1=new O();o1.i=i;o1.j=j+1;T t2=new T(o1,s1);t2.num=t1.num+1;q.offer(t2);}}}}public static boolean check(String s) {//判断是否达到最终状态int x=0,y=0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i)=='A') {x=i;}if (s.charAt(i)=='B') {y=i;}}if(x==posB&&y==posA) {return true;}return false;}public static String swap(String s,int i,int j) {//交换位置char[] c=s.toCharArray();char e=c[i];c[i]=c[j];c[j]=e;return new String(c);}
}
class O{//记录空格坐标int i;int j;
}
class T{//保存状态O x=new O();//记录空格的位置String s;//矩阵的状态public T(O i,String s) {this.s=s;this.x.i=i.i;this.x.j=i.j;}int num;//步数
}

蓝桥杯2016年初赛 卡片换位Java相关推荐

  1. 蓝桥杯 BFS经典题 —— 卡片换位(单走华容道)

    BFS 经典题,可能答案不是最优的,参考一下也是可以的 ^ _ ^ . DFS 相关文章如下所示: <算法笔记>-- "迷宫求解" 之 深度优先搜索(DFS) < ...

  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年省赛真题(Java 大学C组)

    蓝桥杯 2016年省赛真题(Java 大学C组) 第一题:有奖猜谜 第二题:煤球数目 第三题:平方怪圈 第四题:骰子游戏 第五题:分小组 第六题:凑算式 第七题:搭积木 第八题:冰雹数 第九题:四平方 ...

  5. 第十二届蓝桥杯大赛软件赛省赛 Java 大学 B 组(2021年4月18日)

    第十二届蓝桥杯大赛软件赛省赛 Java 大学 B 组第一场 下载原题PDF 欢迎评论区留下答案讨论!!! 试题 A: ASC 本题总分:5 分 [问题描述] 已知大写字母 A 的 ASCII 码为 6 ...

  6. 第十二届蓝桥杯大赛软件赛省赛Java 大学 C 组

    第十二届蓝桥杯大赛软件赛省赛Java 大学 C 组 试题 A: ASC 试题 B: 空间 试题 C: 卡片 试题 D: 相乘 试题 E: 路径 试题 F: 时间显示 试题 G: 最少砝码 试题 H: ...

  7. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  8. 第十届蓝桥杯大赛软件赛省赛——Java大学A组

    第十届蓝桥杯大赛软件赛省赛--Java大学A组 试题A:平方和 public class TestA {static boolean has2019(int number) {String strin ...

  9. 蓝桥杯2016年C语言B组-交换瓶子

    蓝桥杯2016年C语言B组 交换瓶子 代码 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的 ...

最新文章

  1. 2017还有29天,你的目标实现了吗?|内有彩蛋
  2. DOS 和 Linux 常用命令的对比
  3. 8_Markdown和LaTex的使用中的一些小技巧
  4. SSIS中代码页(Code Page)问题
  5. 内部错误:无法加载 ABAP 报表 LVBRKF0I
  6. android实现首页倒计时,android 利用CountDownTimer实现时分秒倒计时效果
  7. flowable 集成mongodb
  8. 3D版pix2pix来了,画一只猫就能抱起来吸丨github
  9. linux 安装adobe字体,Adobe Creative Cloud应用程序已更新,为iOS 13和iPadOS提供免费的自定义字体...
  10. 微信api接口调用-给微信好友或群聊发消息
  11. android 开发 耳机接口 自拍,首次用KXD手机就为之倾倒,这就是KXD K30手机带来了魅力...
  12. android 开机动画 卡顿,开机动画没按帧率播放 有卡顿
  13. Ubuntu系统设置时区时间
  14. MATLAB连接MYSQL搞数据
  15. 硬件设计基础----MOS管
  16. 前端利用高德实时定位_web使用高德地图
  17. 【Windows】win10多桌面与多任务
  18. Python-urllib2的使用
  19. mysql安装了libaio还是报错_ubuntu安装mysql遇到的坑----解决Mysql报错缺少libaio.so.1
  20. Python课程第一天_上午_课程笔记(硬件以及进制)

热门文章

  1. HttpRunner学习记录(一)
  2. IP 地址是如何被创建和管理的?
  3. 西电硕士论文latex使用说明
  4. win10开机自动进行宽带拨号
  5. ABAP-HTTP发送JSON
  6. NTC3950 100k 1%热敏电阻阻值和ADC采集值的转换
  7. 图像处理之Zhang Suen细化算法
  8. 钢琴键盘excel_如何使用键盘在Excel中设置行高和列宽
  9. java 做外挂 内联汇编
  10. Asterisk中meetme会议功能报错