AcWing 2005.马蹄铁 (DFS)

题目链接

https://www.acwing.com/problem/content/2007/

思路

dfs,维护两个变量,记录左右括号的数量即可。

AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 6;
int n;
char map[N][N];
int ans = 0;
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };
bool visited[N][N];
void dfs(int x,int y,int l,int r)
{
	visited[x][y] = true;
	if(l==r)
	{
		ans = max(ans, l + r);//如果左右括号一样多则取一次答案
		visited[x][y] = false;
		return;
	}
	for(int i=0;i<4;i++)
	{
		int a = dx[i] + x;
		int b = dy[i] + y;

		if(a>=0&&a<n&&b>=0&&b<n&&!visited[a][b])
		{
			if(map[x][y]==')'&&map[a][b]=='(')
				continue;
			if(map[a][b]=='(')//如果当前是左括号,加入visited数组标记走下一趟
			{
				dfs(a, b, l + 1, r);
			}
			else
			{
				dfs(a, b, l, r + 1);//类似上面
			}
		}
	}
	visited[x][y] = false;
}
int main(int argc, char* argv[])
{
	cin >> n;

	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin >> map[i][j];
		}
	}
	if (map[0][0] == ')')//如果一开始就是右括号则无答案
		cout << 0;
	else
	{
		dfs(0, 0, 1, 0);//从第一个点开始搜
		cout << ans;
	}
	
}

心得

本来维护了一个栈来写,结果错了,不知道错在哪,这个思路是copy的,不过很巧妙,直接抽象化了。
题目好像没我想的复杂,不用判断合法与否

posted @ 2022-01-24 11:38  张牧歌  阅读(44)  评论(0编辑  收藏  举报