IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Шахматная задача, Фигуры не могут прыгать через друг друга
Hindelberg
сообщение 21.11.2005 17:33
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Задача: НА шахматной доске слон и ладья(белые). НАйти сколько на доске клеток, куда можно поставить черную пешку чтобы ее нельзя было срубить слоном или ладьей. Это я сделал.

Код

if (i+j=cs+bs) or (i-j=cs-bs) then
mas[i,j]:=1;
end;
mas[cs,bs]:=2;
for i:=1 to n do
for j:=1 to n do
begin
if (i=cl) or (j=bl) then
mas[i,j]:=1;
end;
mas[cl,bl]:=3;
for i:=n downto 3 do
for j:=1 to n do
if mas[i,j]=0 then s:=s+1;


cl, cs - цифра ладьи и слона соответственно
bl, bs - буква ладьи и слона соответственно

В этом решении я не учел, что фигуры не могут прыгать друг через друга.
Как это сделать? rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 21.11.2005 20:56
Сообщение #2


Гость






To: Hindelberg
Я понимаю ,это выглядит ужасно, но я бы сразу делал проверку бьющихся полей с учетом того, закрывается ли одна фигура другой:
const
n = 8;
var
arr: array[1 .. n, 1 .. n] of integer;

var
i, j: integer;
const
cs = 2; bs = 2;
bl = 2; cl = 5;

begin
for i := 1 to n do
for j := 1 to n do
arr[i, j] := 0;

arr[cl, bl] := 0;
arr[cs, bs] := 2;

j := pred(bl);
while (j > 1) and (arr[cl, j] < 2) do dec(j);
while (j < 9) and (arr[cl, j] < 2) do begin
arr[cl, j] := 1; inc(j);
end;

i := pred(cl);
while (i > 0) and (arr[i, bl] < 2) do dec(i);
inc(i);
while (i < 9) and (arr[i, bl] < 2) do begin
arr[i, bl] := 1; inc(i);
end;

arr[cl, bl] := 3;
arr[cs, bs] := 0;

i := bs;
while (i > 0) and (cs - (bs-i) > 0) and (arr[cs - (bs - i), i] < 2) do dec(i);
inc(i);
while (i < 9) and (cs - (bs-i) < 9) and (arr[cs - (bs - i), i] < 2) do begin
arr[cs - (bs - i), i] := 1; inc(i);
end;

i := bs;
while (i > 0) and (cs + (bs-i) in [1 .. 8]) and (arr[cs + (bs - i), i] < 2) do dec(i);
inc(i);
while (i < 9) and (cs + (bs-i) < 9) and (arr[cs + (bs - i), i] < 2) do begin
arr[cs + (bs - i), i] := 1; inc(i);
end;

arr[cl, bl] := 3;
arr[cs, bs] := 2;

for i := 1 to n do begin
for j := 1 to n do
write(arr[i, j]:2);
writeln
end;
writeln;

{
Здесь - подсчет нулевых полей ...
}
end.
wacko.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 22:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"