http://acm.pku.edu.cn/JudgeOnline/problem?id=1099

http://acm.pku.edu.cn/JudgeOnline/images/1099/1099_1.gif

http://acm.pku.edu.cn/JudgeOnline/images/1099/1099_2.gif

Код:
var
s,du,dl:array[0..11,0..11] of integer;
i,j,k,m:integer;
ti:longint;
begin
ti:=0;
repeat
  inc(ti);
  readln(m);
  if m=0 then break;
  for i:=1 to m do
    begin
    for j:=1 to m do
      read(s[i,j]);
    readln;
    end;
  fillchar(du,sizeof(du),0);
  fillchar(dl,sizeof(dl),0);
  for i:=0 to m do
    for j:=1 to m do
      if s[i,j]=1 then
        begin
        k:=pred(j);
        while (k>=1) do
          begin
          if s[i,k]<>0 then break;
          dl[i,k]:=-1;
          dec(k);
          end;
        k:=succ(j);
        while (k<=m) do
          begin
          if s[i,k]<>0 then break;
          dl[i,k]:=1;
          inc(k);
          end;
        k:=pred(i);
        while (k>=1) do
          begin
          if s[k,j]<>0 then break;
          du[k,j]:=1;
          dec(k);
          end;
        k:=succ(i);
        while (k<=m) do
          begin
          if s[k,j]<>0 then break;
          du[k,j]:=-1;
          inc(k);
          end;
        end
      else
        if s[i,j]=-1 then
          begin
          k:=pred(j);
          while (k>=1) do
            begin
            if s[i,k]<>0 then break;
            dl[i,k]:=1;
            dec(k);
            end;
          k:=succ(j);
          while (k<=m) do
            begin
            if s[i,k]<>0 then break;
            dl[i,k]:=-1;
            inc(k);
            end;
          k:=pred(i);
          while (k>=1) do
            begin
            if s[k,j]<>0 then break;
            du[k,j]:=-1;
            dec(k);
            end;
          k:=succ(i);
          while (k<=m) do
            begin
            if s[k,j]<>0 then break;
            du[k,j]:=1;
            inc(k);
            end;
          end;
  if ti<>1 then writeln;
  writeln('Case ',ti,':');
  writeln;
  for i:=1 to 3+(m shl 2) do
    write('*');
  writeln;
  for i:=1 to m do
    begin
    if i<>1 then
      begin
      write('*');
      for j:=1 to m do
        write('  H ');
      writeln(' *');
      write('*');
      for j:=1 to m do
        begin
        write('  ');
        if (du[i,j]<>1) and (s[i,j]<>1) then write('|') else write(' ');
        write(' ');
        end;
      writeln(' *');
      end;
    write('*');
    for j:=1 to m do
      begin
      if (dl[i,j]<>1) and (s[i,j]<>-1) then write('H-') else write(' ');
      write('O');
      if (dl[i,j]<>-1) and (s[i,j]<>-1) then write('-H') else write(' ');
      end;
    writeln('*');
    if i<>m then
      begin
      write('*');
      for j:=1 to m do
        begin
        write('  ');
        if (du[i,j]<>-1) and (s[i,j]<>1) then write('|') else write(' ');
        write(' ');
        end;
      writeln(' *');
      end;
    end;
  for i:=1 to 3+(m shl 2) do
    write('*');
  writeln;
until false;
end.