题目传送门:https://www.acwing.com/problem/content/2007/
解题思路:首先一看二维图形矩阵,就知道是搜索。那么怎么搜索?思路大致是从(1,1)开始出发,先捡‘(’,当捡到‘)’后就只能捡‘)’,一直到搜到‘)’的数量与前面‘(’相等时,搜索便可停止。
具体怎么实现呢?既然是dfs搜索,那么就可以按dfs的版子写。首先dfs函数内的终止条件,搜到‘)’的数量与前面‘(’相等时停止,但要注意的一点是,当第一次(1,1)进入时,两个括号都是0,也相等;所以再加一个终止条件当前的括号为右括号‘)’。接着就是for循环移动数组去dfs递归,这里也是本题重点,因为要写两个for循环,第一个for用于搜‘(’,第二个for用于搜‘)’,并且要用第一个for进入第二个for,第二个for一但进入就要搜‘)’搜到底。具体怎么转化成代码,下面还有部分注释供大家理解。
实现代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<deque>
#include<cstring>
using namespace std;
#define ll long long
const int maxn = 200000 + 500;
const int inf = 1e9 + 7;
int a[10][10];
int vis[10][10];//标记
int n;
int ans=0;//最后答案
int mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int sum1,int sum2){//sum1记录(的数量 。 sum2记录)的数量
if(a[x][y]&&sum1==sum2) {//终止条件
if(ans<2*sum2){
ans=2*sum1;return;
}
}
if(!a[x][y])
{
for(int i=0;i<4;i++){
int nowx=x+mov[i][0],nowy=y+mov[i][1];
if(nowx<n&&nowx>=0&&nowy<n&&nowy>=0&&!vis[nowx][nowy]){
vis[nowx][nowy]=1;
if(!a[nowx][nowy])
sum1++;
else sum2=1;//如果搜到)后,sum2赋值为一,进入第二个for
//cout<<nowx<<' '<<nowy<<" sum1:"<<sum1<<endl;
dfs(nowx,nowy,sum1,sum2);
//回溯
if(!a[nowx][nowy])
sum1--;
vis[nowx][nowy]=0;
}
}
}
else{
for(int i=0;i<4;i++){
int nowx=x+mov[i][0],nowy=y+mov[i][1];
if(nowx<n&&nowx>=0&&nowy<n&&nowy>=0&&!vis[nowx][nowy]&&a[nowx][nowy]){//比上面多了一个检验是不是‘)’,并且一旦进入,dfs就会搜‘)’到底
vis[nowx][nowy]=1;
sum2++;
//cout<<nowx<<' '<<nowy<<" sum2:"<<sum2<<endl;
dfs(nowx,nowy,sum1,sum2);
//回溯
sum2--;
vis[nowx][nowy]=0;
}
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
char c;
cin >> c;
if (c == '(')a[i][j] = 0;
else a[i][j] = 1;
}
if(a[0][0]){cout<<0;return 0;}
vis[0][0]=1;
dfs(0,0,1,0);
cout<<ans;
return 0;
}