-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlenta1.pas
133 lines (123 loc) · 2.99 KB
/
lenta1.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{ MK 2002 }
{ XII Olimpiados 224 uzdavinys LENTA }
{ nera teisingas algoritmas, reikia taikyti grafo virsunio poru algoritma }
program lentaMAS;
type
Tlenta = array [1 .. 50, 1 .. 50] of integer;
var
xx, yy : integer;
lenta : Tlenta;
procedure nuskaitymas (var xx, yy : integer; var lenta : Tlenta);
var
f : text;
pgx, pgy, ck, pg : integer;
begin
assign (f, 'lenta.dat');
reset (f);
readln (f, xx, yy);
for pgx := 1 to xx do
for pgy := 1 to yy do
lenta [pgx, pgy] := 0;
readln (f, pg);
for ck := 1 to pg do
begin
readln (f, pgx, pgy);
lenta [pgx, pgy] := -1;
end;
close (f)
end;
procedure zymek (var lenta : Tlenta);
var
ckx, cky : Integer;
begin
for ckx := 1 to xx do
for cky := 1 to yy do
if lenta [ckx, cky] <> -1 then
begin
if (ckx - 1 >= 1) and (lenta [ckx - 1, cky] > -1) then inc (lenta [ckx, cky]);
if (cky - 1 >= 1) and (lenta [ckx, cky - 1] > -1) then inc (lenta [ckx, cky]);
if (ckx + 1 <= xx) and (lenta [ckx + 1, cky] > -1) then inc (lenta [ckx, cky]);
if (cky + 1 <= yy) and (lenta [ckx, cky + 1] > -1) then inc (lenta [ckx, cky])
end
end;
procedure min (var x, y : integer; var lenta : Tlenta);
var
pgx, pgy, ckx, cky : integer;
begin
pgx := 0;
pgy := 0;
for ckx := 1 to xx do
for cky := 1 to yy do
if (lenta [ckx, cky] <> -1) and ((pgx = 0) and (pgy = 0) or
(lenta [ckx, cky] < lenta [pgx, pgy])) then
begin
pgx := ckx;
pgy := cky
end;
x := pgx;
y := pgy
end;
procedure valyk (var maz, x, y : integer; var lenta : Tlenta);
var
pgx, pgy : integer;
begin
maz := 1;
pgx := x;
pgy := y;
if (x - 1 >= 1) and (lenta [x - 1, y] > -1) and
((pgx = x) and (pgy = y) or (lenta [x - 1, y] < lenta [pgx, pgy])) then
begin
pgx := x - 1;
pgy := y;
maz := 2
end;
if (x + 1 <= xx) and (lenta [x + 1, y] > -1) and
((pgx = x) and (pgy = y) or (lenta [x + 1, y] < lenta [pgx, pgy])) then
begin
pgx := x + 1;
pgy := y;
maz := 2
end;
if (y - 1 >= 1) and (lenta [x, y - 1] > -1) and
((pgx = x) and (pgy = y) or (lenta [x, y - 1] < lenta [pgx, pgy])) then
begin
pgy := y - 1;
pgx := x;
maz := 2
end;
if (y + 1 <= yy) and (lenta [x, y + 1] > -1) and
((pgx = x) and (pgy = y) or (lenta [x, y + 1] < lenta [pgx, pgy])) then
begin
pgy := y + 1;
pgx := x;
maz := 2
end;
lenta [x, y] := -1;
if (pgx <> x) or (pgy <> y) then
begin
lenta [pgx, pgy] := -1;
end
end;
function rask (var lenta : TLenta) : integer;
var
ckx, cky, sk, maz, viso : integer;
begin
viso := 0;
for ckx := 1 to xx do
for cky := 1 to yy do
if lenta [ckx, cky] > -1 then inc (viso);
sk := 0;
while viso > 0 do
begin
min (ckx, cky, lenta);
valyk (maz, ckx, cky, lenta);
dec (viso, maz);
if maz = 2 then inc (sk)
end;
rask := sk
end;
begin
nuskaitymas (xx, yy, lenta);
zymek (lenta);
writeln (rask (lenta))
end.