Процедуры. Шахматная задача
Помогите пожалуйста решить задачку! Шахматную доску представляем как символьная матрица размером 8*8. Даны натуральные числа n и m (1<=n<=8, 1<=m<=8) - номера вертикали и горизонтали, определяющие местоположение коня. Соответствующий элемент матрицы надо положить равным символу *, а остальные поля - символу 0. Данные операции оформляются в виде процедуры. Результат помещается в файл результата.
Люди! Помогите пожалуйста!
-
- Сообщения: 526
- Зарегистрирован: 03 янв 2009, 23:17
- Откуда: Voronezh
- Контактная информация:
Код: Выделить всё
procedure horse(n,m:byte);
var doska:array[1..8,1..8] of char;
i,j:byte;
f:text;
name:string;
begin
for i:=1 to 8 do for j:=1 to 8 do doska[i,j]:='0';
doska[n,m]:='*';
writeln('Zadaite imia i put dlia rezultiruiuschego faila: ');
readln(name);
if length(name)=0 then name:='c:/f_result.txt';
assign(f,name);
rewrite(f);
for i:=1 to 8 do for j:=1 to 8 do writeln(f,doska[i,j],i:3,j:3);
writeln('Gotovo.');
readln;
end.
Нет религии выше истины
ой, извините пожалуйста, неправильно написал задание. Шахматную доску представляем как символьная матрица размером 8*8. Даны натуральные числа n и m (1<=n<=8, 1<=m<=8) - номера вертикали и горизонтали, определяющие местоположение коня. Соответствующий элемент матрицы надо положить равным символу "К". Поля, находящиеся под угрозой коня, надо положить равным символу "*", а остальные поля - символу 0. Данные операции оформляются в виде процедуры. Результат помещается в файл результата.
0 0 0 0 0 0 0 0
0 0 * 0 * 0 0 0
0 * 0 0 0 * 0 0
0 0 0 К 0 0 0 0
0 * 0 0 0 * 0 0
0 0 * 0 * 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 * 0 * 0 0 0
0 * 0 0 0 * 0 0
0 0 0 К 0 0 0 0
0 * 0 0 0 * 0 0
0 0 * 0 * 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
-
- Сообщения: 526
- Зарегистрирован: 03 янв 2009, 23:17
- Откуда: Voronezh
- Контактная информация:
doska[n,m]:='K';doska[n+2,m+1]:='*';doska[n+2,m-1]:='*'; doska[n-2,m+1]:='*';doska[n-2,m-1]:='*';doska[n+1,m+2]:='*'; doska[n-1,m+2]:='*';doska[n+1,m-2]:='*';doska[n-1,m-2]:='*'; Подумай как это сделать более компактнее и рациональней.
Нет религии выше истины
то, что это так можно я знаю. Хотелось бы увидеть более компактное решение. Наверняка оно существует.
-
- Сообщения: 526
- Зарегистрирован: 03 янв 2009, 23:17
- Откуда: Voronezh
- Контактная информация:
dimka писал(а):то, что это так можно я знаю. Хотелось бы увидеть более компактное решение. Наверняка оно существует.
Можно попробовать что-то подобное:if ((abs(i-n)=2) and (abs(j-m)=1)) or ((abs(j-m)=2) and (abs(i-n)=1)) then doska[i,j]:='*';
(Я думаю понятно, что это должно быть в цикле)
Нет религии выше истины
и еще не зыбыть контролировать выход за границы диапазона индекса. Т.е. чтобы тестируемые j, i были в пределах [1;8]
-
- Сообщения: 526
- Зарегистрирован: 03 янв 2009, 23:17
- Откуда: Voronezh
- Контактная информация:
Код: Выделить всё
uses crt;
var stroka,stolbec:integer;
procedure horse(n,m:byte);
var doska:array[1..8,1..8] of char;
i,j:byte;
f:text;name:string;
begin
for i:=1 to 8 do
for j:=1 to 8 do
begin
if ((abs(i-n)=2) and (abs(j-m)=1))
or ((abs(j-m)=2) and (abs(i-n)=1))
then doska[i,j]:='*'
else doska[i,j]:='0';
end;
doska[n,m]:='K';
writeln('Zadaite imia i put dlia rezultiruiuschego faila: ');
readln(name);
writeln;
if length(name)=0 then name:='c:/f_result.txt';
assign(f,name);
rewrite(f);
for i:=1 to 8 do
begin
j:=0;
repeat
j:=j+1;
write(f,doska[i,j],' ');
write(doska[i,j],' ');
until j=8;
writeln(f);
writeln;
end;
writeln;
writeln('Resultaty zapisanny v fail ',name);
readln;
end;
begin
repeat
clrscr;
writeln('Nomer stroki-> ');
readln(Stroka);
writeln('Nomer stolbca-> ');
readln(Stolbec);
until (stroka>0) and (stroka<=8) and (stolbec>0) and (stolbec<=8);
horse(stroka,stolbec);
end.
Нет религии выше истины
Огромное спасибо!)