励志用尽量少的代码做高效表达


问题描述

你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

输入格式:

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

输出格式:

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


建议:这是一道BFS或DFS的变形题,对初学者来说还是有一点压力的。如果你对搜索模板题还没有掌握的话,那么请先比较熟练的掌握深搜、广搜模板后再来尝试解决。

  • 搜索原理的视频链接——>传送门1
  • 这是一道比较好的搜索模板练手题——>传送门2
  • 解析在这里——>传送门3

思路分析

思路一:DFS
一开始以为需要“数字华容道”游戏的策略,或者需要一些技巧和推动, 也因此迟迟不敢动笔, 网搜后发现,直接用DFS暴力推过去就可以:

以空格为起点, 上下左右探索, 每次回溯交换位置即可。(-_-|| 我还是不够暴力)

有一点需要注意:
一般来讲,我们做DFS的题时,都是习惯先判断该步是否满足条件,如果满足,则对应的标记数组置1, 回溯,回溯结束后标记数组置0.

但对于本题来说,则需要用if循环判断是否满足条件,共有三种回溯的可能,这样如果每种可能都重复以上的三步, 那么代码就会冗余、易错。

解决办法是:对于每种可能的回溯情况, 无论是否符合,都进行回溯,在下一次回溯开始前统一判断是否符合条件, 如果符合,则vis再置1。这样不仅大大精简了代码,也提高了代码的可读性和效率


思路二:BFS
明天更新, 请持续关注~


一些小技巧:
1. 要使用getchar()处理输入的字符,因为存在空格,scanf或cin无法识别,并且这样的数也很难被存进数组里, 本解法没有使用数组, 以几个数的相对位置来模拟出数组, 请读者细心体会。
2、涉及到坐标的运算时,用结构体模拟坐标求解,往往更为简洁。
3、dfs函数中有一行代码为:if(step > Min) return;在求最短路时加此代码,可以很好的提高代码效率


DFS解法代码展示

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int Min = inf;
struct{int x, y;
}a, b, k; int vis[3][3][3][3][3][3];                //标记数组,标记某点是否走过 int Next[4][2] = {{1,0}, {-1, 0}, {0, 1}, {0, -1}};     //分别代表向右,向左,向上,向下走 void dfs(int x1, int y1, int x2, int y2, int x, int y, int step) {if(step > Min) return;         //提高效率,步数超过直接return; if(x1==b.x && y1==b.y && x2==a.x && y2==a.y) {Min = min(step, Min);return;}//先判断越界if(x<0 || x>1 || y<0 || y>2) return;if(vis[x1][y1][x2][y2][x][y] == 1) return;vis[x1][y1][x2][y2][x][y] = 1; for(int i = 0; i < 4; i++) {int tx = x+Next[i][0];int ty = y+Next[i][1];if(tx==x1 && ty==y1) dfs(x, y, x2, y2, x1, y1, step+1);else if(tx==x2 && ty==y2) dfs(x1, y1, x, y, x2, y2, step+1);else dfs(x1, y1, x2, y2, tx, ty, step+1);}vis[x1][y1][x2][y2][x][y] = 0;
}int main() {memset(vis, 0, sizeof(vis)); //输入 for(int i = 0; i < 2 ; i++) {for(int j = 0; j < 3; j++) {char s = getchar();if(s=='A') { a.x=i; a.y=j; }if(s=='B') { b.x=i; b.y=j; }if(s==' ') { k.x=i; k.y=j; }}getchar();}//处理dfs(a.x, a.y, b.x, b.y, k.x, k.y,0); cout << Min << endl;return 0;
}

这世界就是,一些人总在昼夜不停的努力,而另外一些人,起床就发现世界已经变了。 加油,陌生人!

44行代码AC_卡片换位(DFS变形题 视频讲解 )相关推荐

  1. 15行代码AC_ 【蓝桥杯】兴趣小组(解题报告+思考)

    励志用更少的代码做更高效的表达 问题描述: 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.tx ...

  2. 18行代码AC_排序 HDU - 1106(sstream简单解法)

    励志用少的代码做高效表达. Problem describe 输入一行数字,如果我们把这行数字中的'5'都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应 ...

  3. php视频吾爱破解,php 32行代码简单实现抖音无水印视频api,附前台页面

    原理和之前发的python 22行代码简单实现通过分享链接下载无水印视频一样.现在是通过php再次实现,并暴露出接口,这样可以方便前台开发页面.直接上代码 [PHP] 纯文本查看 复制代码<?p ...

  4. 16行代码AC_蓝桥杯 2017年C组第三题 算式900(暴力解法+DFS解法)

    励志用更少的代码做更高效的表达 题目描述: 小明的作业本上有道思考题: 看下面的算式: (□□□□-□□□□)*□□=900 其中的小方块代表0~9的数字,这10个方块刚好包含了0~9中的所有数字. ...

  5. 25行代码AC_ 2017年C/C++ A组第四题 方格分割(dfs剪痕+解题报告)

    励志用少的代码做高效表达 问题描述: 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同.   如图:p1.png, p2.png, p3.png 就是可行的分割法.   试计算: ...

  6. 21行代码AC_ 试题H: 修改数组【解题报告】

    励志用更少的代码做更高效的表达 题目描述 给定一个长度为N 的数组A = [A1, A2,-,AN],数组中有可能有重复出现的整数. 现在小明要按以下方法将其修改为没有重复整数的数组.小明会依次修改A ...

  7. 16行代码AC_【第十届蓝桥杯省赛c/c++B组真题解析】7.完全二叉树的权值

    励志用更少的代码做更高效的表达 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下.从左到右的顺序依次是 A1, A2, · · · AN,如下图所示 现在小明要把相同深度的 ...

  8. 22行代码AC_试题 历届试题 油漆面积【解题报告】

    励志用更少的代码做更高效的表达 X星球的一批考古机器人正在一片废墟上考古. 该区域的地面坚硬如石.平整如镜. 管理人员为方便,建立了标准的直角坐标系. 每个机器人都各有特长.身怀绝技.它们感兴趣的内容 ...

  9. 25行代码AC_蓝桥杯 2017A组省赛第九题 分巧克力(暴力优化)

    励志用少的代码做高效表达 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需 ...

最新文章

  1. DMA讲解《一》(清华大学)
  2. 优秀的.NET Winform UI控件(标价$399):DotNetMagic Version 3.0 Released
  3. 十款常见的开源数据库学习资料大汇总
  4. 【操作系统】-- 时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法
  5. 【一个挺蠢的小东西= =】页面展示富文本编辑器的图片的适配尺寸问题
  6. google hacking
  7. 解决苹果手机连接了wifi,依旧无法更新系统的问题
  8. Report Builder简单的使用操作
  9. 软件设计师提纲+复习资料整理(上午题)
  10. ZOOM join meeting提示密码错误
  11. 峨眉派的创始人真的是郭襄吗?
  12. 四步,用python实现一辆自动驾驶的小车
  13. python根据IP查询地理位置
  14. Android录制或播放语音消息时关闭其他媒体播放
  15. 3650m5服务器内存选择 ibm_重返荣耀 联想System x3650 M5服务器评测
  16. 《图解http》和《图解TCP/IP》——对于计算机网络的书籍推荐
  17. 国外网盘Box和Dropbox区别?
  18. h2数据库增删改查基本操作
  19. html--简单竖向菜单栏的实现
  20. 2021蓝牙耳机排行榜:这五款音质、颜值顶尖的蓝牙耳机上榜当之无愧!

热门文章

  1. 某瓜数据之sign参数分析
  2. Netty学习笔记(一)Netty客户端源码分析
  3. Spring循环依赖的三种方式,你都清楚吗?
  4. 干货!全面认识Docker和基本指令
  5. Kafka分区分配策略(1)——RangeAssignor
  6. Java虚拟机类加载机制——案例分析
  7. 『Go 语言底层原理剖析』文末送书
  8. 通过实例理解 Go 逃逸分析
  9. 深入Go的底层,带你走近一群有追求的人
  10. LiveVideoStackCon2021音视频技术大会北京站开幕在即,精彩抢鲜看