先用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.