Section 2.1 The Castle

本文介绍了一种使用深度优先搜索(DFS)解决迷宫问题的方法,并通过FloodFill算法来寻找最大连通区域,同时考虑了墙壁拆分对迷宫路径的影响。该算法能够找出拆除特定墙壁后形成的两个相邻区域的合并所能达到的最大区域数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先用DFS做一个Flood Fill

然后枚举墙并判断 记住按照题目要求枚举

具体看标程 这题是挺难的

{
ID: yaoyuan4
PROG: castle
LANG: PASCAL
}
Program castle;
type
  css = record
   west, north, east, south : boolean;
  end;
const
  fx : array[1..4] of longint = (1, 2, 4, 8);
  inf = 'castle.in'; outf = 'castle.out';
var
  m, n, ans, ansi, ansj, amx : longint;
  f : array[0..100, 0..100] of css;
  opi : array[0..100, 0..100] of longint;
  dj : array[0..10000] of longint;
  ansk : char;
Procedure vaei(x : longint; var y : css);
  var
   i, k : longint;
  begin
   for i := 4 downto 1 do
    if x >= fx[i] then
     begin
      dec(x, fx[i]);
      with y do
       case i of
        4 : south := true;
        3 : east := true;
        2 : north := true;
        1 : west := true;
       end;
     end;
  end;
Procedure init;
  var
   i, j, k : longint;
  begin
   assign(input, inf); reset(input);
   readln(m, n);
   for i := 1 to n do
    begin
     for j := 1 to m do
      begin
       read(k);
       vaei(k, f[i, j]);
      end;
     readln;
    end;
   close(input);
   fillchar(opi, sizeof(opi), 0);
   fillchar(dj, sizeof(dj), 0);
   ans := 0; amx := 0;
  end;
Procedure dfs(x, y : longint);
  var
   i : longint;
  begin
   opi[x, y] := dj[0];
   inc(dj[dj[0]]);
   if y > 1 then
    if (not(f[x, y].west)) and (opi[x, y-1] = 0) then dfs(x, y-1);
   if x > 1 then
    if (not(f[x, y].north)) and (opi[x-1, y] = 0) then dfs(x-1, y);
   if y < m then
    if (not(f[x, y].east)) and (opi[x, y+1] = 0) then dfs(x, y+1);
   if x < n then
    if (not(f[x, y].south)) and (opi[x+1, y] = 0) then dfs(x+1, y);
  end;
Procedure work;
  var
   i, j, ts : longint;
  begin
   for i := 1 to n do
    for j := 1 to m do
     if opi[i, j] = 0 then
      begin
       inc(dj[0]);
       dfs(i, j);
      end;
    for i := 1 to dj[0] do
     if dj[i] > amx then amx := dj[i];
    for j := 1 to m do
     for i := n downto 1 do
      begin
       if (f[i, j].north) and (i > 1) and (opi[i, j] <> opi[i-1, j]) then
        begin
         ts := dj[opi[i, j]] + dj[opi[i-1, j]];
         if ts > ans then
          begin
           ans := ts;
           ansi := i;
           ansj := j;
           ansk := 'N';
          end;
        end;
       if (f[i, j].east) and (j < m) and (opi[i, j] <> opi[i, j+1])  then
        begin
         ts := dj[opi[i, j]] + dj[opi[i, j+1]];
         if ts > ans then
          begin
           ans := ts;
           ansi := i;
           ansj := j;
           ansk := 'E';
          end;
        end;
      end;
  end;
Procedure print;
  var
   i : longint;
  begin
   assign(output, outf); rewrite(output);
   writeln(dj[0]);
   writeln(amx);
   writeln(ans);
   writeln(ansi,' ',ansj,' ',ansk);
   close(output);
  end;
begin
  init;
  work;
  print;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值