Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
57
Добавлен:
10.05.2014
Размер:
3.74 Кб
Скачать
{$M 64000,0,600000}
program knight_jump;
const
MAX_SIZE = 8;
type
str_symbols = string[10];
str_message = string[40];
str_filename = string[11];
chessboard = record
board:array[1..MAX_SIZE,1..MAX_SIZE] of integer;
N:byte;
s:integer;
end;
knight = record
turn:integer;
i,j:shortint;
end;
move = record
dx,dy:shortint;
end;
moves = array[1..8] of move;
const
valid_moves:moves = ( (dx: 2;dy: 1),(dx: 1;dy: 2),(dx:-1;dy: 2),(dx:-2;dy: 1),
(dx:-2;dy:-1),(dx:-1;dy:-2),(dx: 1;dy:-2),(dx: 2;dy:-1));
function get_string(message:str_message):str_filename;
var
response:str_filename;
begin
write(message,': ');
readln(response);
get_string:=response;
end;
function open_files(file_in_name,file_out_name:str_filename;var file_in,file_out:text):boolean;
begin
assign(file_in,file_in_name);
assign(file_out,file_out_name);
{$I-}
reset(file_in);
rewrite(file_out);
{$I+}
open_files:=ioresult=0;
end;
procedure get_data(var file_in:text;var board:chessboard;var k_pos:knight);
var
i,j:byte;
begin
readln(file_in,board.N);
readln(file_in,k_pos.i);
readln(file_in,k_pos.j);
k_pos.turn:=1;
for i:=1 to board.N do
for j:=1 to board.N do
board.board[i,j]:=0;
board.board[k_pos.i,k_pos.j]:=1;
board.s:=sqr(board.N);
end;

procedure print_chessboard(var file_out:text;board:chessboard);
var
i,j:byte;
begin
for i:=1 to board.N do
begin
for j:=1 to board.N do
write(file_out,board.board[i,j]:3);
writeln(file_out);
end;
end;

function jump_knight(var file_out:text;board:chessboard;k_pos:knight):boolean;
var
i:byte;
{ new_board:chessboard;}
new_k_pos:knight;
found:boolean;
begin
found:=false;
if(k_pos.turn<board.s)then{Ґб«Ё Ґбвм бў®Ў®¤­лҐ Є«ҐвЄЁ}
begin
i:=0;
new_k_pos.turn:=k_pos.turn+1;
while(i<8) and not found do{¤Ґ« вм ¤«п ўбҐе ў аЁ ­в®ў 室 , Ї®Є  ­Ґ ­ ©¤Ґвбп Їа ўЁ«м­л©}
begin
i:=i+1;
new_k_pos.i:=k_pos.i+valid_moves[i].dx;{¤ўЁЈ Ґ¬ «®и ¤м}
new_k_pos.j:=k_pos.j+valid_moves[i].dy;
if(new_k_pos.i>0) and (new_k_pos.j>0) and (new_k_pos.i<=board.N) and (new_k_pos.j<=board.N)then{Ґб«Ё «®и ¤м
­Ґ Ї®ЄЁ­г«  Ї®«Ґ}
begin
if(board.board[new_k_pos.i,new_k_pos.j]=0)then{Ґб«Ё вг¤  ¬®¦­® б室Ёвм}
begin
{ new_board:=board;}
board.board[new_k_pos.i,new_k_pos.j]:=new_k_pos.turn;{§ ЇЁблў Ґ¬ ­  ¤®бЄг ­®¬Ґа 室 }
found:=jump_knight(file_out,board,new_k_pos);{४габЁў­® Їа®ўҐа塞 ®бв ўиЁҐбп 室л}
board.board[new_k_pos.i,new_k_pos.j]:=0;
end;
end;
end;
jump_knight:=found;
end
else{Ё­ зҐ}
begin
jump_knight:=true;
print_chessboard(file_out,board);{ўлў®¤Ё¬ Їгвм}
end;
end;

var
file_in,file_out:text;
file_in_name,file_out_name:str_filename;
board:chessboard;
k_pos:knight;
begin
file_in_name:=get_string('‚ўҐ¤ЁвҐ Ё¬п ўе®¤­®Ј® д ©« ');{Ї®«гз Ґ¬ Ё¬Ґ­  д ©«®ў}
file_out_name:=get_string('‚ўҐ¤ЁвҐ Ё¬п ўл室­®Ј® д ©« ');
if(open_files(file_in_name,file_out_name,file_in,file_out))then{®вЄалў Ґ¬ д ©«л}
begin{Ґб«Ё ®вЄал«Ёбм}
get_data(file_in,board,k_pos);{зЁв Ґ¬ ­ з «м­лҐ гб«®ўЁп}
if not jump_knight(file_out,board,k_pos)then{Ґб«Ё «®и ¤м ­Ґ ¬®¦Ґв Їа®©вЁ ¤®бЄг}
writeln(file_out,'’ Єго ¤®бЄг ­Ґ«м§п ®Ў®©вЁ, Їа®е®¤п Є ¦¤го Є«ҐвЄг Ї® ®¤­®¬г а §г.');{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ ў д ©«}
close(file_in);{§ Єалў Ґ¬ д ©«л}
close(file_out);
writeln('Ќ ¦¬Ё ENTER Ё ᬮвਠ१г«мв вл ў ',file_out_name);
end
else{Ё­ зҐ}
writeln('ЌҐў®§¬®¦­® ®вЄалвм д ©«(л)! Ќ ¦¬Ё ENTER ¤«п ўл室 .');{ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
readln;
end.
Соседние файлы в папке 02