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的,不过很巧妙,直接抽象化了。
题目好像没我想的复杂,不用判断合法与否
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~