DFS爆搜
状态转移的关键特点:
(
可以走到(
或)
但是)
只能走到)
,所以要记录上一个点的状态,从而判断当前点能否走- 更新答案要满足
(
的数量等于)
的数量,所以爆搜时要记录
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10;
char g[N][N];
bool st[N][N];
int n,ans;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void dfs(int l,int r,int x,int y) //f:0( f:1)
{
st[x][y]=true; //注意是在这个位置标记st,因为第一个点也要标记
if(l==r)
{
ans=max(l+r,ans);
st[x][y]=false; //别忘了恢复现场
return;
}
for(int i=0;i<4;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a<0||b<0||a>=n||b>=n||st[a][b]) continue;
if(g[a][b]=='('&&g[x][y]==')') continue;
if(g[a][b]==')') dfs(l,r+1,a,b);
else dfs(l+1,r,a,b);
}
st[x][y]=false;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>g[i];
if(g[0][0]=='(') dfs(1,0,0,0);
cout<<ans<<endl;
return 0;
}