Чтобы упростить программу, будем выводить команды типа "сделай ЕДИНИЦА", где ЕДИНИЦА и ДЕВЯТЬ - процедуры.
Описание процедуры:
процедура <имя процедуры>
нач
<тело процедуры>
кон
процедура ЕДИНИЦА
поворот шаг шаг шаг шаг
поворот поворот
прыжок прыжок прыжок прыжок
поворот
процедура ДЕВЯТЬ
шаг поворот шаг шаг шаг
шаг поворот шаг поворот шаг
шаг поворот шаг поворот поворот поворот
прыжок прыжок поворот
тело программы: программа Число 1919
сделай ЕДИНИЦА
прыжок
сделай ДЕВЯТЬ
Подробнее - на -
//PascalABC.NET версия 3.4.0.1677 от 17.06.18
//Если программа не запускается, то обновите версию
const
input_file = 'Kon.in';
output_file = 'Kon.out';
type
TCell = class
public
x, y: integer;
constructor Create(coords: string);
begin
coords := coords.Trim().ToLower();
y := StrToInt(coords[2]);
x := ord(coords[1]) - ord('a') + 1;
end;
constructor Create(i, j: integer);
y := j;
x := i;
function IsDeskCell(): boolean;
Result := (x > 0) and (y > 0) and (x <= 8) and (y <= 8);
class function operator+(a, b: TCell): TCell;
Result := new TCell(a.x + b.x, a.y + b.y);
class function operator=(a, b: TCell): boolean;
Result := (a.x = b.x) and (a.y = b.y);
function ToString: string; override;
Result := Format('({0}, {1})', x, y);
procedure PrintAnswer(path: List<TCell>);
var f := OpenWrite(output_file);
Writeln(f, path.Count() - 1);
Println(path.Count() - 1);
Println(path);
f.Close();
var knight_steps := Arr(
new TCell(1, 2),
new TCell(2, 1),
new TCell(2, -1),
new TCell(1, -2),
new TCell(-1, -2),
new TCell(-2, -1),
new TCell(-2, 1),
new TCell(-1, 2)
);
// var f := OpenWrite(input_file);
// Writeln(f, 'a1');
// Writeln(f, 'b2');
// f.Close();
// Exit;
var f := OpenRead(input_file);
var pawn_place: TCell := new TCell(f.ReadlnString());
var knight_place: TCell := new TCell(f.ReadlnString());
var paths := new List<List<TCell>>();
var occupied_cells := new List<TCell>();
paths.Add(Seq(knight_place).ToList);
occupied_cells.Add(knight_place);
repeat
var new_paths := new List<List<TCell>>();
foreach var path in paths do
foreach var step in knight_steps do
var p := new List<TCell>(path);
var t := p.Last + step;
if t.IsDeskCell() and not occupied_cells.Contains(t) then begin
p.Add(t);
new_paths.Add(p);
occupied_cells.Add(t);
if t = pawn_place then begin
PrintAnswer(p);
Exit;
paths := new_paths;
until (false)
end.
Чтобы упростить программу, будем выводить команды типа "сделай ЕДИНИЦА", где ЕДИНИЦА и ДЕВЯТЬ - процедуры.
Описание процедуры:
процедура <имя процедуры>
нач
<тело процедуры>
кон
процедура ЕДИНИЦА
нач
поворот шаг шаг шаг шаг
поворот поворот
прыжок прыжок прыжок прыжок
поворот
кон
процедура ДЕВЯТЬ
нач
шаг поворот шаг шаг шаг
шаг поворот шаг поворот шаг
шаг поворот шаг поворот поворот поворот
прыжок прыжок поворот
кон
тело программы: программа Число 1919
нач
сделай ЕДИНИЦА
прыжок
сделай ДЕВЯТЬ
прыжок
сделай ЕДИНИЦА
прыжок
сделай ДЕВЯТЬ
кон
Подробнее - на -
//PascalABC.NET версия 3.4.0.1677 от 17.06.18
//Если программа не запускается, то обновите версию
const
input_file = 'Kon.in';
output_file = 'Kon.out';
type
TCell = class
public
x, y: integer;
constructor Create(coords: string);
begin
coords := coords.Trim().ToLower();
y := StrToInt(coords[2]);
x := ord(coords[1]) - ord('a') + 1;
end;
constructor Create(i, j: integer);
begin
y := j;
x := i;
end;
function IsDeskCell(): boolean;
begin
Result := (x > 0) and (y > 0) and (x <= 8) and (y <= 8);
end;
class function operator+(a, b: TCell): TCell;
begin
Result := new TCell(a.x + b.x, a.y + b.y);
end;
class function operator=(a, b: TCell): boolean;
begin
Result := (a.x = b.x) and (a.y = b.y);
end;
function ToString: string; override;
begin
Result := Format('({0}, {1})', x, y);
end;
end;
procedure PrintAnswer(path: List<TCell>);
begin
var f := OpenWrite(output_file);
Writeln(f, path.Count() - 1);
Println(path.Count() - 1);
Println(path);
f.Close();
end;
begin
var knight_steps := Arr(
new TCell(1, 2),
new TCell(2, 1),
new TCell(2, -1),
new TCell(1, -2),
new TCell(-1, -2),
new TCell(-2, -1),
new TCell(-2, 1),
new TCell(-1, 2)
);
// var f := OpenWrite(input_file);
// Writeln(f, 'a1');
// Writeln(f, 'b2');
// f.Close();
// Exit;
var f := OpenRead(input_file);
var pawn_place: TCell := new TCell(f.ReadlnString());
var knight_place: TCell := new TCell(f.ReadlnString());
f.Close();
var paths := new List<List<TCell>>();
var occupied_cells := new List<TCell>();
paths.Add(Seq(knight_place).ToList);
occupied_cells.Add(knight_place);
repeat
var new_paths := new List<List<TCell>>();
foreach var path in paths do
begin
foreach var step in knight_steps do
begin
var p := new List<TCell>(path);
var t := p.Last + step;
if t.IsDeskCell() and not occupied_cells.Contains(t) then begin
p.Add(t);
new_paths.Add(p);
occupied_cells.Add(t);
end;
if t = pawn_place then begin
PrintAnswer(p);
Exit;
end;
end;
end;
paths := new_paths;
until (false)
end.