马蹄铁
思路
因为这道题目的数据范围很小,可以直接使用DFS搜索所有的情况。
我们先来分析一下合法括号字符串的特点:
- 左半部分全是左括号,右半部分全是右括号
- 左右括号数量相等
再看一下左右括号状态的转移:
- 如果当前字符串最右边是左括号,那么它可以接收左括号或者右括号
- 如果当前字符串最右边是右括号,那么它只能接收右括号
关于实现,可以在dfs函数上加几个参数,代表已经存在的
l
和r
的数量,另外dfs函数开始的地方要标记一下,在dfs函数结束前面要恢复状态。
代码
//普通DFS
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n;
char g[N][N];
bool st[N][N];
int ans;
int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
//这里的l和r是进入完本次的次数
void dfs(int sx, int sy, int l, int r)
{
st[sx][sy] = true;
if(l == r)
{
ans = max(ans, l + r);
st[sx][sy] = false;
return;
}
for(int i = 0; i < 4; i++)
{
int a = sx + dx[i], b = sy + dy[i];
if(a < 0 || a >= n || b < 0 || b >= n) continue;
if(st[a][b]) continue;
if(g[sx][sy] == ')' && g[a][b] == '(') continue;
if(g[a][b] == '(') dfs(a,b,l+1,r);
else dfs(a,b,l,r+1);
}
st[sx][sy] = false;
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++) cin >> g[i];
if(g[0][0] == '(')
{
dfs(0,0,1,0);
}
cout << ans << endl;
return 0;
}