文章目录

  • 迷宫
    • 分析
    • 代码(return 递归函数)
      • 通过截图
    • 代码(不return递归函数:定义全局变量)
      • 通过截图(能得到正确答案)
    • 手算
  • 方格分割
    • 分析
    • 代码
      • 通过截图

迷宫

X 星球的一处迷宫游乐场建在某个小山坡上。它是由 10×10 相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L 表示走到左边的房间,
R 表示走到右边的房间,
U 表示走到上坡方向的房间,
D 表示走到下坡方向的房间。
X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把 100 名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。迷宫地图如下:UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?如果你还没明白游戏规则,可以参看下面一个简化的 4x4 迷宫的解说图:图片描述

运行限制
最大运行时间:1s
最大运行内存: 128M

分析

  • dfs:首先把数据存储在文件中,然后读取文件中的每一行,通过将字符串转变为列表的方法,使得每一行里面元素独立,即每一行添加的列表内部是多个字符,这样就可以构建出一个二维列表(当然,这里也可以通过输入等方式构建,只要能构建出来就可以)
  • 建立同等规模的标记数组,0表示还没走过,1表示走过
  • 首先确定终止条件:即越界就证明能够走出去,即返回1
  • 如果走过了,即前面标记过,则表示进入了循环,则走不出去,自然返回为0
  • 首先我要走这点,标记数组将这点标记为1,如果走到上下左右(UDLR),进入对应的dfs,注意进入对应的dfs需要return
  • 首先,我们要明确一点,就是如果只写进入递归,最外层递归得不到返回的话会return void,所以进入递归要return 递归函数。有人可能会问:“为什么之前的回溯算法在用的时候,不用return 递归函数呢?”,原因是:之前将结果添加到列表,而列表是一个可迭代对象,简单理解就是默认是一个全局变量
  • 所以,如果只进行递归而不return的话,我们直接在函数内定义全局变量然后再输出即可
  • 当然,这里回溯其实很暴力,看每次循环又重新将空间全部置为0就知道了,但小规模题目随便怎么算,甚至这道题手算都很简单

代码(return 递归函数)

file_list = [] # 储存文件的数据
with open('1.txt','r') as file:for i in file.readlines():file_list.append(list(i.strip()))flag = [[0]*10 for _ in range(10)] # 0还没走过,1走过了def dfs(x,y):if x < 0 or x > 9 or y < 0 or y > 9:return 1if flag[x][y] == 1:return 0flag[x][y] = 1if file_list[x][y] == 'U':        return dfs(x-1,y)elif file_list[x][y] == 'D':return dfs(x+1,y)elif file_list[x][y] == 'L':return dfs(x,y-1)elif file_list[x][y] == 'R':return dfs(x,y+1)res = 0
for i in range(10):for j in range(10):flag = [[0]*10 for _ in range(10)] # 0还没走过,1走过了res+=dfs(i,j)print(res)

通过截图

代码(不return递归函数:定义全局变量)

file_list = [] # 储存文件的数据
with open('1.txt','r') as file:for i in file.readlines():file_list.append(list(i.strip()))flag = [[0]*10 for _ in range(10)] # 0还没走过,1走过了def dfs(x,y):global resif x < 0 or x > 9 or y < 0 or y > 9:res+=1return if flag[x][y] == 1:return flag[x][y] = 1if file_list[x][y] == 'U':        dfs(x-1,y)elif file_list[x][y] == 'D':dfs(x+1,y)elif file_list[x][y] == 'L':dfs(x,y-1)elif file_list[x][y] == 'R':dfs(x,y+1)res = 0
for i in range(10):for j in range(10):flag = [[0]*10 for _ in range(10)] # 0还没走过,1走过了dfs(i,j)print(res)

通过截图(能得到正确答案)

手算

  • 从最外层看,绿色为走出,红色为走不出,数数就知道绿色格子有31个。这种方法比编程更简单,我们从最外层开始数,逐渐拓展到最内层,如果全部外围都已经走不出时,内部也就走不出了,但是外围都走得出,不一定内部就走得出,比如:上下,和左右作为两对矛盾组,如果两个格子对应方位为这种情况,会一直在这两个格子徘徊。

方格分割

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。如下就是三种可行的分割法。

试计算: 包括这 3 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。运行限制
最大运行时间:1s
最大运行内存: 128M

分析

  • 从图形上不难看出,所有满足的图形都关于(3,3)对称,这是本题最重大的突破点。假设,有一个图形他不包括边界,另外一个图形必定包括所有边界,但这样两个图形不相等。所以,我们可以把问题转化为从中心点开始画切割线和反向切割线(有反向切割线就会避免去切割线走在反向切割线的位置),计算有多少种到达边界的方式。
  • 由于这个图形四个方向旋转一致,所以最后肯定是还要整除4的
  • 终止条件:如果切割线超出边界则结束,并且记录加1种方式。
  • 标记路径:切割线和反向切割线标记为1
  • 循环:对四个方向进行搜索,得到新的x和y。如果新的x和y超过边界,则剪枝(continue),如果新的坐标点没有访问过,进入递归之中。
  • 最后加上回溯的条件,路径标记为0

代码

res = 0
dir = [(-1,0),(1,0),(0,-1),(0,1)] # 上下左右的方向(二维数组)vis = [[0]*7 for _ in  range(7)] # 表示这时候还没走def dfs(x,y):global res# 终止条件if x == 0 or x == 6 or y == 0 or y == 6:res+=1returnvis[x][y] = vis[6-x][6-y] = 1 # 标记已经走过for i in range(4):new_x = x + dir[i][0]new_y = y + dir[i][1]if new_x < 0 or new_x > 6 or new_y < 0 or new_y > 6:continue # 剪枝if not vis[new_x][new_y]: # 如果新的坐标点未访问dfs(new_x,new_y)# 回溯(标记的对象是x,y)vis[x][y] = vis[6-x][6-y] = 0dfs(3,3)
print(res//4)

通过截图

答案是509

如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ

迷宫,方格分割(python)相关推荐

  1. 方格分割 蓝桥杯心得

    标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共有多 ...

  2. 蓝桥杯第八届省赛JAVA真题----方格分割

    标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共有多 ...

  3. 第八届蓝桥杯第四题方格分割

    题目如下: 标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在 ...

  4. dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割

    记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...

  5. 2017蓝桥杯C++A:方格分割(DFS)

    四.题目:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...

  6. 肺实质分割python实现

    肺实质分割python实现 最近在做医学图像处理项目,是一个分类任务,输入是肺部CT图像,看到好多大佬的第一步都是肺实质分割,减少噪声.经过几天的努力终于实现了,在这里做一个简单的记录. 找代码的时候 ...

  7. 第八届蓝桥杯-第四题方格分割

    标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分.  要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算:  包括这3种分法在内,一共 ...

  8. Java实现第八届蓝桥杯方格分割

    方格分割 题目描述 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...

  9. python用一行代码画个迷宫_用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

最新文章

  1. idea CRLF LF 编码问题,解决保存时自动更改换行符
  2. Android Q Labs| 结束演讲
  3. Vue.js学习系列(二十八)-- 计算属性(二)
  4. html5 的百度地图连接
  5. [vue] 怎么使css样式只在当前组件中生效?
  6. html5点击视频跳转,javascript – 播放后重定向html5视频
  7. 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?
  8. AIX安装中文语言包
  9. h3c s5500-28c-si操作
  10. MySQL的常用SQL脚本
  11. 【Prison Break】第六天(4.2)
  12. 使用浏览器合成语音播放
  13. Gym - 100781A Adjoin the Networks (树的直径)
  14. [转]斗鱼大数据搭建的经验和坑
  15. intellij no executable code found at line
  16. VMware故障:配置文件(.vmx)损坏修复
  17. 建站过程中,网站优化的雷区
  18. 求过圆心直线与圆的两个交点
  19. 如何解决服务器挖矿木马
  20. 分段函数的期望和方差_概率论中数学期望什么时候不存在?

热门文章

  1. 论文阅读:AF2S3Net:Attentive Feature Fusion with Adaptive Feature Selection for Sparse Semantic
  2. 09 游戏画面管理与切换控制
  3. 软解架构中的层次依赖
  4. 一行注释也能影响代码运行?别不信!
  5. 数据库长时间卡顿优化
  6. python 区别None与数字0
  7. Style2paints:专业的AI漫画线稿自动上色工具
  8. STM32读取GPS(北斗)数据驱动程序
  9. UE4 AI行为树(一)AI追逐玩家
  10. Stata-DID:不同处理时点不同持久期的倍分法(flexpaneldid)