Шахматы


Задача:

  Файл INPUT.TXT содержит две записи - первая это положение слона на шахматной доске, вторая - положение ладьи, написанные через пробел (например: a4 c2). Требуется определить количество клеток на шахматной доске, в которые можно поставить фигуру противника, так чтобы она не была бита этими двумя фигурами. Ответ записать в файл OUTPUT.TXT .

Описание:

  Для удобства создадим массив(B) 8на8 и будем присваивать клетке 0, если она не бита и 1, если бита. Сразу вычеркнем (заполним единицами) все клетки в столбце и строке с ладьёй, а также на двух диагоналях, которые бьются слоном. Далее в программе рассмотрены восемь случаев, когда ладья перекрывает некорые клетки, в которые может сходить слон, и соответственно, когда слон мешает ладье. Можно сделать по другому: скажем двигаться от ладьи и слона в четырёх направлениях(соответственно по горизонт/вертик-алям и диагоналям) и считать клетки до тех пор, пока не встрется другая фигура или будет достигнут конец шахматной доски. Алгоритм, расположенный ниже, лучше не переделывать, следуя золотому правилу программиста: работает - не трогай. 8)


Код:


program three;
var f: text;
    m: string;
    B: array[1..8,1..8] of integer;
    j,code: integer;
    i,l1,s1,p,k: integer;
    l2,s2,s: integer;
Begin
s:=0;
Assign(f,'INPUT.TXT');
 Reset(f);
 Read(f,m);
l1:= Ord(m[4])-96;  {преобразуем символ в число и отнимем 96 для получения чесел 1..8}
 Val(m[5],l2,code);
s1:= Ord(m[1])-96;
 Val(m[2],s2,code);
Close(f);

for i:= 1 to 8 do begin
  for j:= 1 to 8 do begin
    if i=l1 then B[i,j]:=1;
    if j=l2 then B[i,j]:=1;
    if abs(i-s1)=abs(j-s2) then B[i,j]:=1;
                    end;
                  end;

for i:= 1 to 8 do begin
  for j:= 1 to 8 do begin
    if (abs(i-s1)=abs(j-s2)) and (i=l1) and (j=l2) then begin
if (l1 < s1) and (l2 < s2) then begin
                            for p:=1 to l1-1 do begin
                            for k:=1 to l2-1 do
                            B[p,k]:=0;
                            end;
                            end;
if (l1 < s1) and (l2 > s2) then begin
                            for p:=1 to l1-1 do begin
                            for k:=l2+1 to 8 do
                            B[p,k]:=0;
                            end;
                            end;
if (l1 > s1) and (l2 < s2) then begin
                            for p:=l1+1 to 8 do begin
                            for k:=1 to l2-1 do
                            B[p,k]:=0;
                            end;
                            end;
if (l1 > s1) and (l2 > s2) then begin
                            for p:=l1+1 to 8 do begin
                            for k:=l2+1 to 8 do
                            B[p,k]:=0;
                            end;
                            end;
                                                    end;
if (s1=l1) and (s2 < l2) then begin
                            for k:=1 to s2-1 do
                            B[s1,k]:=0
                            end;
if (s1=l1) and (s2 > l2) then begin
                            for k:=s2+1 to 8 do
                            B[s1,k]:=0
                            end;
if (s2=l2) and (s1 < l1) then begin
                            for p:=1 to s1-1 do
                            B[p,s2]:=0
                            end;
if (s2=l2) and (s1 > l1) then begin
                            for p:=s1+1 to 8 do
                            B[p,s2]:=0
                            end;
end;end;
for i:= 1 to 8 do begin
  for j:= 1 to 8 do begin
  if B[i,j]=0 then s:=s+1;
                    end;
                  end;

Assign(f,'OUTPUT.TXT');
 Rewrite(f);
 Write(f,s);
Close(f);

for i:= 1 to 8 do begin
  for j:= 1 to 8 do begin
  Write(B[i,j]);
		    end;
  writeln;
		  end;
readln;
End.




Hosted by uCoz