8.9 马蹄印 2493

题目

虽然当奶牛贝里斯找到平衡序列后很高兴了,但是他现在对序列提出了一个更高的要求,就是要求每个序列中必须是先一定数量的左括号然后是与左括号相同数量的右括号。例如:(((()))),就是一个完美的平衡序列。
当贝里斯某天在农场上走的时候,他在地上发现了马蹄印,这个农场是一个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.
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值