(File IO): input:hshoe.in output:hshoe.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
虽然当奶牛贝里斯找到平衡序列后很高兴了,但是他现在对序列提出了一个更高的要求,就是要求每个序列中必须是先一定数量的左括号然后是与左括号相同数量的右括号。例如:(((()))),就是一个完美的平衡序列。
当贝里斯某天在农场上走的时候,他在地上发现了马蹄印,这个农场是一个
N
∗
N
N*N
N∗N的方格,每个小方格中都有一个马蹄印。贝里斯希望从方格的最左上角的地方开始出发,然后每次可以向上或者向下或者向左或者向右移动一步,使得他走过的每个小方格中的马蹄印能够组成一个完美的平衡序列。当然了,贝里斯不能重复经过任何小方格。
请帮助贝里斯在这个
N
∗
N
N*N
N∗N的方格中找出长度最长的完美序列的长度。
输入
第一行一个正整数
N
N
N,表示农场的大小。
接下来
N
N
N行,每行
N
N
N个字符,表示
N
∗
N
N*N
N∗N的方格上马蹄印的分布情况。
输出
只有一行一个整数,表示最长的完美序列的长度,如果不存在这样的完美序列(例如起始位置就是右括号),则输出
0
0
0。
样例输入
4
(())
()((
(()(
))))
样例输出
8
数据范围限制
2<=N<=5。
解题思路
深搜ing:如果是左括号就
r
i
g
h
t
+
1
right+1
right+1,如果是有括号就
l
e
f
t
+
1
left+1
left+1
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int dx[5]={0,-1,0,0,1};
const int dy[5]={0,0,-1,1,0};
int a[1000][1000];
char f[10][10];
int n,ans;
string c;
bool check(int x,int y)
{
if(x>0&&y>0&&x<=n&&y<=n&&!a[x][y]) return 1;
return 0;
}
void dfs(int x,int y,int l,int r)
{
if(l==r)
{
ans=max(ans,l+r);
return;
}
for(int i=1;i<=4;i++)
{
if(check(x+dx[i],y+dy[i]))
{
a[x+dx[i]][y+dy[i]]=1;
if(f[x+dx[i]][y+dy[i]]=='('&&!r)
dfs(x+dx[i],y+dy[i],l+1,r);
if(f[x+dx[i]][y+dy[i]]==')')
dfs(x+dx[i],y+dy[i],l,r+1);
a[x+dx[i]][y+dy[i]]=0;
}
}
}
int main()
{
freopen("hshoe.in","r",stdin);
freopen("hshoe.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>c;
for(int j=1;j<=n;j++)
f[i][j]=c[j-1];
}
a[1][1]=1;
if(f[1][1]==')')
printf("0");
else{
dfs(1,1,1,0);
printf("%d",ans);
}
}