Шахматы
Задача:
Файл 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.
|
|