1. 问题描述:

尽管奶牛贝茜发现每个平衡括号字符串都很美观,但她特别喜欢被她称为"完全"平衡的括号字符串----一个由 ( 构成的字符串后接一个长度相同的 ) 构成的字符串。例如:(((())))
有一天,当贝茜穿过牛棚时,她发现地面上有一个 N×N 的马蹄铁矩阵。每个马蹄铁的方向都看上去像 ( 或 )。从矩阵的左上角开始,贝茜希望四处走动以拾起马蹄铁,使得她捡起的马蹄铁按顺序构成的括号字符串是完全平衡的。请计算她能得到的最长完全平衡括号字符串的长度。每一步中,贝茜可以沿上下左右四个方向移动。她只能移动到包含马蹄铁的方格区域内,当她进入该区域时就会拿起那里的马蹄铁,并无法再次回到该位置(因为该位置没有马蹄铁了)。她首先拿起的是左上角的马蹄铁。由于她拿起的马蹄铁要形成一个完全平衡的字符串,因此她可能无法将所有马蹄铁都拿起来。

输入格式

第一行包含整数 N。接下来 N 行,每行包含一个长度为 N 的括号字符串,用来表示括号矩阵。

输出格式

输出她能得到的最长完全平衡括号字符串的长度。如果无法得到完全平衡括号字符串(例如,左上角马蹄铁形如 )),则输出 0。

数据范围

2 ≤ N ≤ 5

输入样例:

4
(())
()((
(()(
))))

输出样例:

8
样例解释
贝茜的移动步骤如下:
1())
2)((
345(
876)
来源:https://www.acwing.com/problem/content/description/2007/

2. 思路分析:

分析题目可以知道数据规模很小,并且我们需要在二维矩阵中找到完全平衡的括号序列,所以我们可以使用dfs来解决,使用dfs搜索所有的括号序列找到最长的完全平衡的括号序列,由题目可知完全平衡的字符串需要满足的条件为:上一个位置为左括号那么可以转移的下一个位置的状态可以是左括号也可以是右括号,上一个位置为右括号那么可以转移的下一个位置的状态只能够是右括号,可以看成是一个简单的状态机,在搜索的时候判断下一个状态是否合法如果合法才可以转移过去,在dfs的方法中需要记录当前递归的位置以及左右括号的数量,方便判断转移的下一个状态是否合法,使用vis数组判断当前递归的位置是否之前已经访问过了。

3. 代码如下:

from typing import Listclass Solution:res = 0def dfs(self, n: int, x: int, y: int, l: int, r: int, g: List[List[str]], vis: List[List[int]],pos: List[List[int]]):# 标记当前的位置已经被访问vis[x][y] = 1if l == r:# 当左右括号相等的时候说明需要更新答案了self.res = max(self.res, l + r)vis[x][y] = 0returnfor i in range(4):a, b = x + pos[i][0], y + pos[i][1]# 判断是否越界或者是已经被访问过了if 0 <= a < n and 0 <= b < n and vis[a][b] == 0:# 下面这个状态是不合法的if g[x][y] == ")" and g[a][b] == "(": continueif g[a][b] == "(":self.dfs(n, a, b, l + 1, r, g, vis, pos)else:self.dfs(n, a, b, l, r + 1, g, vis, pos)# 回溯vis[x][y] = 0def process(self):n = int(input())g = list()for i in range(n):g.append(list(input()))if g[0][0] == "(":# vis为判重列表vis = [[0] * n for i in range(n)]# pos为下左右四个方向pos = [[0, 1], [0, -1], [1, 0], [-1, 0]]self.dfs(n, 0, 0, 1, 0, g, vis, pos)return self.resif __name__ == "__main__":print(Solution().process())

2005 马蹄铁(dfs)相关推荐

  1. AcWing 2005. 马蹄铁

    思路:dfs 代码: #include <iostream> #include <cstring> #include <algorithm>using namesp ...

  2. 寒假每日一题2022【week1 完结】

    目录 2058. 笨拙的手指[枚举] 2041. 干草堆[差分] 2060. 奶牛选美[dfs + 思维] 2019. 拖拉机[双端队列] 2014. 岛[思维+离散化] 2005. 马蹄铁[dfs] ...

  3. AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 15 日)

    目录 1/2 AcWing 2058. 笨拙的手指 1/3 (前缀和)AcWing 2041. 干草堆 1/4 (dfs暴力枚举)AcWing 2060. 奶牛选美 1/5 (bfs)AcWing 2 ...

  4. 【CF1209E】Rotate Columns【状压DP】【位运算】【贪心】

    题意:给一个N×MN \times MN×M的矩阵,可以进行任意多次操作将一列轮换,求每一行的最大值之和的最大值.多组数据. Easy VersionN≤4N \leq 4N≤4,M≤100M \le ...

  5. 【数位DP】CF 54C,509C,431D,628D,855E,1245F,95D

    这一次有题解了!! T1:CF54C First Digit Law title solution code T2:CF509C Sums of Digits title solution code ...

  6. zoj 3761(并查集+搜索)

    题意:在一个平面上,有若干个球,给出球的坐标,每次可以将一个球朝另一个球打过去(只有上下左右),碰到下一个球之后原先的球停下来,然后被撞的球朝这个方向移动,直到有一个球再也撞不到下一个球后,这个球飞出 ...

  7. codeforces 628D. Magic Numbers 数位dp

    题目链接 给两个数m, d. 两个数a, b. a, b长度小于2000, 长度相等.求在a, b之间的数x, x%m==0, 并且从高位往低位数, 奇数位的数全部不等于d, 偶数为的数全都等于d, ...

  8. 1341:【例题】一笔画问题

    [题目描述] 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路. 根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历:找欧拉路,则对一个奇点 ...

  9. 一本通 动态规划专栏

    数塔问题 [问题描述] 观察下面的数塔.写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大. 每一步可以从当前点走到左下角的点,也可以到达右下角的点. image.png [输入形 ...

  10. Problem J: 神医胡青牛

    Problem J: 神医胡青牛 题目: 胡青牛是"倚天屠龙记"中的神医,每天都有N多(N<=2000)的人来求他治病,这些人排成一队,从1开始编号直到N ,每个人手里都拿着 ...

最新文章

  1. Android 趣味应用—— 短信编辑器
  2. Mybatis原理分析之一:从JDBC到Mybatis
  3. WebStorm V2017.1版用于Angular2开发的环境设置
  4. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
  5. 获取eclipse 运行时,bundle的相对路径
  6. BootStrap之前奏响应式布局
  7. Linux系统中硬盘的管理
  8. oracle如何取当前日期年月_Oracle获取当前年、月、日的方法
  9. 重载前自增运算符和后自增运算符
  10. 如何将文字转换成二维码?
  11. 百度ai—细粒度图像识别
  12. JDK和JRE安装与下载
  13. 高斯过程--在GPyTorch中实现一个个性化kernel
  14. 各类邮箱谷歌邮箱、Outlook邮箱、雅虎邮箱的购买养号策略
  15. Springboot中使用Robot及Websocket实现windows远程桌面控制
  16. Python操作MyS QL
  17. SAMSUNG,三星,N8000升级
  18. 微信朋友圈卖货五大法则
  19. Java 获取linux根目录下的文件夹_Linux-包教包会系列
  20. HDCP@SKE交互

热门文章

  1. PostgreSQL string_to_array函数应用
  2. numpy中的array函数
  3. mac下使用php cURL方法nginx502错误
  4. 画图工具的认识及应用计算机,认知画图软件教学设计
  5. Python数据可视化大屏最全教程(全)
  6. S2B2B-云分销系统介绍
  7. ubuntu 使用 fdisk 磁盘分区
  8. RNA 14. SCI 文章中差异表达基因之 蛋白互作网络 (PPI)
  9. 台式计算机显卡最高温度多少,笔记本/台式机显卡核心多少度正常?GPU温度过高该如何处理?...
  10. 解决win10新建文本文档内容可以打开但显示图标不对的问题