acwing-马蹄铁

尽管奶牛贝茜发现每个平衡括号字符串都很美观,但她特别喜欢被她称为“完全”平衡的括号字符串----一个由 ( 构成的字符串后接一个长度相同的 ) 构成的字符串。

例如:

(((())))

有一天,当贝茜穿过牛棚时,她发现地面上有一个 N×NN×N 的马蹄铁矩阵。每个马蹄铁的方向都看上去像 ( 或 )

从矩阵的左上角开始,贝茜希望四处走动以拾起马蹄铁,使得她捡起的马蹄铁按顺序构成的括号字符串是完全平衡的。

请计算她能得到的最长完全平衡括号字符串的长度。

每一步中,贝茜可以沿上下左右四个方向移动。

她只能移动到包含马蹄铁的方格区域内,当她进入该区域时就会拿起那里的马蹄铁,并无法再次回到该位置(因为该位置没有马蹄铁了)。

她首先拿起的是左上角的马蹄铁。

由于她拿起的马蹄铁要形成一个完全平衡的字符串,因此她可能无法将所有马蹄铁都拿起来。

输入格式

第一行包含整数 NN。

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

输出格式

输出她能得到的最长完全平衡括号字符串的长度。

如果无法得到完全平衡括号字符串(例如,左上角马蹄铁形如 )),则输出 00。

数据范围

2N52≤N≤5

输入样例:

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

输出样例:

8

样例解释

贝茜的移动步骤如下:

1())
2)((
345(
876)

 

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int N=10;
 8 
 9 int n;
10 char g[N][N];
11 bool st[N][N];
12 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
13 int ans;
14 
15 void dfs(int x,int y,int l,int r)
16 {
17     st[x][y]=true;
18     if(l==r)
19     {
20         ans=max(ans,l+r);
21         st[x][y]=false;//恢复现场
22         return;
23     }
24     for(int i=0;i<4;i++)
25     {
26         int a=x+dx[i],b=y+dy[i];
27         if(a>=0&&a<n&&b>=0&&b<n&&!st[a][b])
28         {
29             if(g[x][y]==')'&&g[a][b]=='(') continue;
30             if(g[a][b]=='(') dfs(a,b,l+1,r);
31             else dfs(a,b,l,r+1);
32             
33         }
34     }
35     st[x][y]=false;
36      
37 }
38 
39 int main()
40 {
41     scanf("%d",&n);
42     for(int i=0;i<n;i++) scanf("%s",g[i]);
43     
44     if(g[0][0]=='(') dfs(0,0,1,0);
45     cout<<ans<<endl;
46     
47     return 0;
48 }

 

posted @ 2022-03-03 21:40  不想做混子的奋斗远  阅读(133)  评论(0)    收藏  举报