(紀中)1747. 馬蹄印【DFS】

(File IO): input:hshoe.in output:hshoe.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet


題目描述
雖然當奶牛貝里斯找到平衡序列後很高興了,但是他現在對序列提出了一個更高的要求,就是要求每個序列中必須是先一定數量的左括號然後是與左括號相同數量的右括號。例如:(((()))),就是一個完美的平衡序列。
當貝里斯某天在農場上走的時候,他在地上發現了馬蹄印,這個農場是一個NNN*N的方格,每個小方格中都有一個馬蹄印。貝里斯希望從方格的最左上角的地方開始出發,然後每次可以向上或者向下或者向左或者向右移動一步,使得他走過的每個小方格中的馬蹄印能夠組成一個完美的平衡序列。當然了,貝里斯不能重複經過任何小方格。
請幫助貝里斯在這個NNN*N的方格中找出長度最長的完美序列的長度。


輸入
第一行一個正整數NN,表示農場的大小。
接下來NN行,每行NN個字符,表示NNN*N的方格上馬蹄印的分佈情況。

輸出
只有一行一個整數,表示最長的完美序列的長度,如果不存在這樣的完美序列(例如起始位置就是右括號),則輸出00


樣例輸入
4
(())

()((

(()(

))))

樣例輸出
8


數據範圍限制
2<=N<=5。


解題思路
深搜ing:如果是左括號就 right+1right+1,如果是有括號就 left+1left+1


代碼

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int dx[5]={0,-1,0,0,1};
const int dy[5]={0,0,-1,1,0};
int a[1000][1000];
char f[10][10];
int n,ans;
string c;
bool check(int x,int y)
{
	if(x>0&&y>0&&x<=n&&y<=n&&!a[x][y]) return 1;
	return 0;
}
void dfs(int x,int y,int l,int r)
{	
	if(l==r)
	{
		ans=max(ans,l+r);
		return;
	}
	for(int i=1;i<=4;i++)
	{
		if(check(x+dx[i],y+dy[i]))
		{
			a[x+dx[i]][y+dy[i]]=1;
			if(f[x+dx[i]][y+dy[i]]=='('&&!r)
			dfs(x+dx[i],y+dy[i],l+1,r);
			if(f[x+dx[i]][y+dy[i]]==')')
			dfs(x+dx[i],y+dy[i],l,r+1);
			a[x+dx[i]][y+dy[i]]=0;
			
		}
	}
}
int main()
{
	freopen("hshoe.in","r",stdin);
    freopen("hshoe.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		for(int j=1;j<=n;j++)
		f[i][j]=c[j-1];
	}
	a[1][1]=1;
	if(f[1][1]==')')
		printf("0");
	else{
		dfs(1,1,1,0);
		printf("%d",ans);
	}
} 	

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章