//注意:题目要求以 (((()))) 这种形式存在,不是这种()()(),
//我刚开始就是后者
//一直不知道为什么和答案不一样,调试了半天
//所以在搜索过程中我们只能原原来那种
//这个题每一步只有4种走法,所以我们每一步都去试一下
//即dfs
//换句话说就是比如:我们选了'('那么后面尽量去选(
//因为后面一旦选了)就要一直选),知道达到平衡
//要让长度最长,所以我们要让(选的足够多
//看懂了求个赞吧
#include<iostream>
using namespace std;
const int maxn = 1e4+10;
char nums[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn][maxn];
int n;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
int len = 0;
void dfs(int sx,int sy,int l,int r){
if(l==r&&nums[sx][sy]==')'){//每一次平衡时就更新下
len = max(len,dis[sx][sy]);
return ;
}
for(int i =0 ;i<4;i++){
int nx = sx+dx[i];
int ny = sy + dy[i];
if(nx<0||nx>=n||ny<0||ny>=n)continue;
if(vis[nx][ny])continue;
if(r&&nums[nx][ny]=='('){//如果)有了,就不能再选)
continue;
}
dis[nx][ny] = dis[sx][sy] +1;
vis[nx][ny] =1;
if(nums[nx][ny]==')'){
dfs(nx,ny,l,r+1);
}
else{
dfs(nx,ny,l+1,r);
}
vis[nx][ny] = 0;//恢复现场,尝试下一个方向
dis[nx][ny]--;//因为之前加了一步,所以减去恢复回去,尝试下一种走法
}
}
int main(){
cin>>n;
for(int i = 0 ;i<n;i++){
for(int j =0 ;j<n;j++)
{
cin>>nums[i][j];
}
}
vis[0][0] = 1;
dis[0][0] = 1;
if(nums[0][0]=='('){
dfs(0,0,1,0);
}
else{//如果第一个就是)后面就不能找(,达不到平衡
cout<<0<<endl;
return 0;
}
cout<<len<<endl;
return 0;
}
(马蹄铁)
最新推荐文章于 2022-02-16 20:16:10 发布