Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils;
- const
- MAXIN = 1000;
- type
- mas = record
- n1, s1, e1, w1: boolean;
- data, colour, go: integer;
- end;
- var
- p, last, i, j, n, m, x, y, f, a1, b, z: integer;
- a, c: array [-1..MAXIN, -1..MAXIN] of integer;
- dp: array [-1 ..MAXIN, -1..MAXIN] of mas;
- s, time: string;
- function min(a, b: integer): integer;
- begin
- if (a < b) then
- min := a
- else
- min := b;
- end;
- begin
- p := 1;
- last := 0;
- readln(n, m);
- for i := 0 to n do
- for j := 0 to m do
- begin
- a[i][j] := -1;
- dp[i][j].data := MAXINT - 10;
- end;
- readln(x, y, f);
- readln(a1, b);
- for i := n downto 0 do
- begin
- readln(s);
- s := s + ' ';
- j := 0;
- while (length(s) <> 0) do
- begin
- time := copy(s, 1, pos(' ', s));
- delete(s, 1, pos(' ', s));
- if (pos('N', time) <> 0) then
- dp[i][j].n1 := true;
- if (pos('S', time) <> 0) then
- dp[i][j].s1 := true;
- if (pos('E', time) <> 0) then
- dp[i][j].e1 := true;
- if (pos('W', time) <> 0) then
- dp[i][j].w1 := true;
- inc(j);
- end;
- end;
- dp[x][y].data := 0;
- dp[x][y].go := 1;
- for z := 1 to f do
- for i := 0 to n do
- for j := 0 to m do
- if (dp[i][j].go = z) then
- begin
- if (dp[i][j].n1) and ((dp[i + 1][j].colour <> dp[i][j].colour) or ((dp[i + 1][j].colour = dp[i][j].colour) and (dp[i + 1][j].data > dp[i][j].data))) then
- begin
- dp[i + 1][j].data := min(dp[i + 1][j].data, dp[i][j].data);
- dp[i + 1][j].go := dp[i][j].go + 1;
- end
- else
- if (i < n) and ((dp[i + 1][j].colour <> dp[i][j].colour) or ((dp[i + 1][j].colour = dp[i][j].colour) and (dp[i + 1][j].data > dp[i][j].data))) then
- begin
- dp[i + 1][j].data := min(dp[i + 1][j].data, dp[i][j].data + 1);
- dp[i + 1][j].go := dp[i][j].go + 1;
- end;
- //______________________________
- if (dp[i][j].s1) and ((dp[i - 1][j].colour <> dp[i][j].colour) or ((dp[i - 1][j].colour = dp[i][j].colour) and (dp[i - 1][j].data > dp[i][j].data))) then
- begin
- dp[i - 1][j].data := min(dp[i - 1][j].data, dp[i][j].data);
- dp[i - 1][j].go := dp[i][j].go + 1;
- end
- else
- if (i > 0) and ((dp[i - 1][j].colour <> dp[i][j].colour) or ((dp[i - 1][j].colour = dp[i][j].colour) and (dp[i - 1][j].data > dp[i][j].data))) then
- begin
- dp[i - 1][j].data := min(dp[i - 1][j].data, dp[i][j].data + 1);
- dp[i - 1][j].go := dp[i][j].go + 1;
- end;
- //______________________________
- if (dp[i][j].w1) and ((dp[i][j - 1].colour <> dp[i][j].colour) or ((dp[i][j - 1].colour = dp[i][j].colour) and (dp[i][j - 1].data > dp[i][j].data))) then
- begin
- dp[i][j - 1].data := min(dp[i - 1][j].data, dp[i][j].data);
- dp[i][j - 1].go := dp[i][j].go + 1;
- end
- else
- if (j > 0) and ((dp[i][j - 1].colour <> dp[i][j].colour) or ((dp[i][j - 1].colour = dp[i][j].colour) and (dp[i][j - 1].data > dp[i][j].data))) then
- begin
- dp[i][j - 1].data := min(dp[i][j - 1].data, dp[i][j].data + 1);
- dp[i][j - 1].go := dp[i][j].go + 1;
- end;
- //____________________________
- if (dp[i][j].e1) and ((dp[i][j + 1].colour <> dp[i][j].colour) or ((dp[i][j + 1].colour = dp[i][j].colour) and (dp[i][j + 1].data > dp[i][j].data))) then
- begin
- dp[i][j + 1].data := min(dp[i + 1][j].data, dp[i][j].data);
- dp[i][j + 1].go := dp[i][j].go + 1;
- end
- else
- if (j < m) and ((dp[i][j + 1].colour <> dp[i][j].colour) or ((dp[i][j + 1].colour = dp[i][j].colour) and (dp[i][j + 1].data > dp[i][j].data))) then
- begin
- dp[i][j + 1].data := min(dp[i][j + 1].data, dp[i][j].data + 1);
- dp[i][j + 1].go := dp[i][j].go + 1;
- end;
- end;
- {for i := 0 to n do
- begin
- for j := 0 to m do
- write(dp[i][j].data, ' ');
- writeln;
- end;}
- if (dp[a1][b].data = MAXINT - 10) then
- writeln(-1)
- else
- writeln(dp[a1][b].data);
- readln;
- readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement