题目
虽然当奶牛贝里斯找到平衡序列后很高兴了,但是他现在对序列提出了一个更高的要求,就是要求每个序列中必须是先一定数量的左括号然后是与左括号相同数量的右括号。例如:(((()))),就是一个完美的平衡序列。
当贝里斯某天在农场上走的时候,他在地上发现了马蹄印,这个农场是一个N*N的方格,每个小方格中都有一个马蹄印。贝里斯希望从方格的最左上角的地方开始出发,然后每次可以向上或者向下或者向左或者向右移动一步,使得他走过的每个小方格中的马蹄印能够组成一个完美的平衡序列。当然了,贝里斯不能重复经过任何小方格。
请帮助贝里斯在这个N*N的方格中找出长度最长的完美序列的长度。
数据范围:2<=N<=5
题解
数据那么小,随便搞一个深搜就好了
时间复杂度O(4n4)
代码
const
dx:array[1..4]of integer=(1,0,-1,0);
dy:array[1..4]of integer=(0,1,0,-1);
var
c:boolean;
n,i,j,max:longint;
a:array[0..6,0..6]of char;
b:array[0..6,0..6]of longint;
procedure dfs2(x,y,s,k:longint);
var
i:longint;
begin
if k=s then begin c:=true;exit;end;
for i:=1 to 4 do
if (a[x+dx[i],y+dy[i]]=')')and(b[x+dx[i],y+dy[i]]=0) then
begin
b[x+dx[i],y+dy[i]]:=1;
dfs2(x+dx[i],y+dy[i],s,k+1);
b[x+dx[i],y+dy[i]]:=0;
end;
end;
procedure dfs(x,y,s:longint);
var
i:longint;
begin
if s>max div 2 then
begin
c:=false;
dfs2(x,y,s,0);
if c then max:=s*2;
end;
for i:=1 to 4 do
if (a[x+dx[i],y+dy[i]]='(')and(b[x+dx[i],y+dy[i]]=0) then
begin
b[x+dx[i],y+dy[i]]:=1;
dfs(x+dx[i],y+dy[i],s+1);
b[x+dx[i],y+dy[i]]:=0;
end;
end;
begin
assign(input,'hshoe.in');
assign(output,'hshoe.out');
reset(input);rewrite(output);
readln(n);
for i:=1 to n do
begin
b[0,i]:=-1;b[i,0]:=-1;
b[n+1,i]:=-1;b[i,n+1]:=-1;
for j:=1 to n do
read(a[i,j]);
readln;
end;
b[1,1]:=1;
if a[1,1]='(' then dfs(1,1,1);
writeln(max);
close(input);close(output);
end.