0
点赞
收藏
分享

微信扫一扫

AcWing 2005. 马蹄铁

进击的包籽 2022-01-09 阅读 8
算法c++dfs

题目传送门: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;
}
举报

相关推荐

0 条评论