program heat;
const m1 = 40; n1 = 50;
      m2 = 120; n2 = 120;
      m3 = 180; n3 = 200;
type atype = array[0..m3+1, 0..n3+1] of real;
var a: atype;
    i,j: integer;
procedure init(var a:atype);
var i, j: integer;
begin
   for i := 1 to m3 do
      for j := 1 to n3 do
         a[i,j] := 100.0;
   for j := 0 to n3+1 do
   begin
      a[0,j] := 100.0;
      a[m3+1,j] := 32.0
   end;
   for i := 0 to m3+1 do
   begin
      a[i,0] := (-68.0/(m3+1))*i + 100;
      a[i,n3+1] := a[i,0]
   end;
   for j := n1+1 to n2 -1 do
   begin
      a[m1+1,j] := 212.0;
      a[m2-1,j] := 212.0
   end;
   for i := m1+2 to m2-2 do
   begin
      a[i,n1+1] := 212.0;
      a[i,n2-1] := 212.0
   end
end; (* init *)

procedure step(var a:atype);
var i, j: integer;
begin
   for i := 1 to m3 do
      for j := 1 to n3 do
      begin
         if ((i <= m1) or (i >= m2) or
             (j <= n1) or (j >= n2)    ) then
         a[i,j] := 0.25*(a[i-1,j] + a[i+1,j] +
                        a[i,j-1] + a[i,j+1])
      end
end; (* step *)

function convert(i: integer):char;
var c: array[0..27] of char;
begin
   c := '*ABCDEFGHIJKLMNOPQRSTUVWXYZ*';
   convert := c[30 - (i*26) div 180]
end; (* convert *)

procedure disp(var a:atype);
var 
    i, j: integer;
begin
   for i := 1 to m3 do
   begin
      for j := 1 to n3 do
         if ((i <= m1) or (i >= m2) or
             (j <= n1) or (j >= n2) ) then
            write(convert(trunc(a[i,j])))
         else
            write(' ');
      writeln
   end
end; (* disp *)

procedure key;
var i: integer;
begin
   writeln('Temperature key');
   writeln;
   writeln('Temp    Letter');
   writeln;
   i := 32;
   while i <= 212 do
   begin
      writeln(i:6, convert(i):5);
      i := i + 4
   end
end; (* key *)

begin
   init(a);
   key;
   readln(i);
   while i > 0 do
   begin
      for j := 1 to i do
         step(a);
      disp(a);
      readln(i)
   end
end.
   

