迷宫,方格分割(python)
文章目录
- 迷宫
- 分析
- 代码(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)相关推荐
- 方格分割 蓝桥杯心得
标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共有多 ...
- 蓝桥杯第八届省赛JAVA真题----方格分割
标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共有多 ...
- 第八届蓝桥杯第四题方格分割
题目如下: 标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在 ...
- dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割
记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...
- 2017蓝桥杯C++A:方格分割(DFS)
四.题目:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...
- 肺实质分割python实现
肺实质分割python实现 最近在做医学图像处理项目,是一个分类任务,输入是肺部CT图像,看到好多大佬的第一步都是肺实质分割,减少噪声.经过几天的努力终于实现了,在这里做一个简单的记录. 找代码的时候 ...
- 第八届蓝桥杯-第四题方格分割
标题:方格分割 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...
- Java实现第八届蓝桥杯方格分割
方格分割 题目描述 6x6的方格,沿着格子的边线剪开成两部分. 要求这两部分的形状完全相同. 如图:p1.png, p2.png, p3.png 就是可行的分割法. 试计算: 包括这3种分法在内,一共 ...
- python用一行代码画个迷宫_用 Python 制作一个迷宫游戏
相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...
最新文章
- idea CRLF LF 编码问题,解决保存时自动更改换行符
- Android Q Labs| 结束演讲
- Vue.js学习系列(二十八)-- 计算属性(二)
- html5 的百度地图连接
- [vue] 怎么使css样式只在当前组件中生效?
- html5点击视频跳转,javascript – 播放后重定向html5视频
- 为什么物联网大数据平台,使用TDengine,可不要redis, kafka, spark等软件?
- AIX安装中文语言包
- h3c s5500-28c-si操作
- MySQL的常用SQL脚本
- 【Prison Break】第六天(4.2)
- 使用浏览器合成语音播放
- Gym - 100781A Adjoin the Networks (树的直径)
- [转]斗鱼大数据搭建的经验和坑
- intellij no executable code found at line
- VMware故障:配置文件(.vmx)损坏修复
- 建站过程中,网站优化的雷区
- 求过圆心直线与圆的两个交点
- 如何解决服务器挖矿木马
- 分段函数的期望和方差_概率论中数学期望什么时候不存在?