Description
虽然当奶牛贝里斯找到平衡序列后很高兴了,但是他现在对序列提出了一个更高的要求,就是要求每个序列中必须是先一定数量的左括号然后是与左括号相同数量的右括号。例如:(((()))),就是一个完美的平衡序列。
当贝里斯某天在农场上走的时候,他在地上发现了马蹄印,这个农场是一个N*N的方格,每个小方格中都有一个马蹄印。贝里斯希望从方格的最左上角的地方开始出发,然后每次可以向上或者向下或者向左或者向右移动一步,使得他走过的每个小方格中的马蹄印能够组成一个完美的平衡序列。当然了,贝里斯不能重复经过任何小方格。
请帮助贝里斯在这个N*N的方格中找出长度最长的完美序列的长度。
题解
数据范围最大是5
那么很容易想到dfs
简单的裸搜题
代码
#include<cstdio>
#include<iostream>
using namespace std;
int ans,n,a[10][10],visit[10][10],num;
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
char ch;
bool check(int x,int y)
{
if (visit[x][y]==1) return false;
if (x<1||y<1||x>n||y>n) return false;
return true;
}
void dfs(int dep,int x,int y)
{
if (num==0)
{
ans=max(ans,dep);
return;
}
for (int i=0;i<=3;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if (check(xx,yy)==false||a[x][y]==-1&&a[xx][yy]==1) continue;
num+=a[xx][yy];
visit[xx][yy]=1;
dfs(dep+1,xx,yy);
num-=a[xx][yy];
visit[xx][yy]=0;
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("\n");
for (int j=1;j<=n;j++)
{
scanf("%c",&ch);
if (ch=='(') a[i][j]=1;
else a[i][j]=-1;
}
}
if (a[1][1]==-1)
{
printf("0");
return 0;
}
num=1;
visit[1][1]=1;
dfs(1,1,1);
printf("%d",ans);
}