Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.22.169] |
|
Сообщ.
#1
,
|
|
|
Нужно разработать алгоритм для обхода препятствий, причем припятствия бывают только прямоугольной формы и не могут "пересекаться", а путь может состоять только из горизонтальных и вертикальных линий.
Я конечно пыталась придумать что-то, но никакого обьективного алгоритма не получилось. P.S. Путь, конечно, должен быть наиболее краток. |
Сообщ.
#2
,
|
|
|
Ничего, если на паскале?
Uses Crt;<br>Const<br> Wall = #254;<br> Move = #250;<br> Nk = 250;<br><br>Var<br> R: array [0..79, 0..49] of Byte;<br> Ni: Byte;<br> FX, FY: Byte;<br> i, j: Word;<br><br>Procedure Init;<br>Begin<br> For j := 0 to 49 do<br> For i := 0 to 79 do<br> If (i in [0, 79]) or (j in [0, 49]) then R[i, j] := 255<br> else Case Mem[$B800:j*160+i*2] of<br> 32: R[i, j] := 254;<br> Ord('X'): R[i, j] := 0;<br> 1: R[i, j] := 253;<br> else R[i, j] := 255<br> End;<br> Ni := 0<br>End;<br><br>Procedure Clear;<br>Begin<br> For j := 1 to 48 do<br> For i := 1 to 78 do<br> Case Mem[$B800:j*160+i*2] of<br> Ord(Move):<br> Begin<br> GotoXY(i, j);<br> Write(' '#8)<br> End;<br> 2:<br> Begin<br> GotoXY(i, j);<br> Write(#1#8)<br> End<br> End<br>End;<br><br>Procedure Start;<br>Var<br> Ok: Boolean;<br> X, Y, N, X1, Y1: Byte;<br><br> Procedure Check(X, Y: Byte);<br> Begin<br> Case R[X, Y] of<br> 253: Ok := True;<br> 254: R[X, Y] := Ni+1<br> End<br> End;<br><br> Procedure Find(X, Y: Byte);<br> Begin<br> If R[X, Y] < N then<br> Begin<br> N := R[X, Y];<br> X1 := X;<br> Y1 := Y<br> End<br> End;<br><br>Begin<br> Init;<br> Ok := False;<br> Repeat<br> For j := 1 to 48 do<br> For i := 1 to 78 do<br> Begin<br> If Ok then Break;<br> If R[i, j] = Ni then<br> Begin<br> Check(i, j-1);<br> Check(i+1, j);<br> Check(i, j+1);<br> Check(i-1, j)<br> End<br> End;<br> Inc(Ni)<br> Until Ok or (Ni > Nk);<br> If Ok then<br> Begin<br> X := FX;<br> Y := FY;<br> TextAttr := $93;<br> Repeat<br> N := 255;<br> Find(X, Y-1);<br> Find(X+1, Y);<br> Find(X, Y+1);<br> Find(X-1, Y);<br> If R[X1, Y1] = 0 then Break;<br> GotoXY(X1, Y1);<br> Write(Move);<br> X := X1;<br> Y := Y1<br> Until False<br> End<br> else<br> Begin<br> TextAttr := $9E;<br> GotoXY(FX, FY);<br> Write(#2)<br> End;<br> TextAttr := $4F;<br> Window(1, 1, 80, 50);<br> GotoXY(3, 1);<br> Write('Итераций - ', Ni, '/250 '#8#8);<br> If ReadKey = #0 then ReadKey;<br> TextAttr := $1F;<br> Window(2, 2, 80, 49);<br> Clear;<br> GotoXY(FX, FY)<br>End;<br><br>Begin<br> TextMode(Co80+Font8x8);<br> TextAttr := $4E;<br> ClrScr;<br> GotoXY(3, 50);<br> Write(#27#26#24#25' - Move; Space,Del,PgDn,Home,End,Tab - Wall; Insert - Man; PgUp - Target');<br> GotoXY(54, 1);<br> Write('ENTER - Start; ESC - Exit');<br> Window(2, 2, 79, 49);<br> TextAttr := $1F;<br> ClrScr;<br> Window(2, 2, 80, 49);<br> Repeat<br> Case ReadKey of<br> #00: Case ReadKey of<br> #72: If WhereY > 1 then GotoXY(WhereX, WhereY-1);<br> #75: If WhereX > 1 then GotoXY(WhereX-1, WhereY);<br> #77: If WhereX < 78 then GotoXY(WhereX+1, WhereY);<br> #80: If WhereY < 48 then GotoXY(WhereX, WhereY+1);<br> #71: {Home}<br> Begin<br> If WhereY > 1 then GotoXY(WhereX, WhereY-1);<br> If Mem[$B800:WhereY*160+WhereX*2] = 32 then<br> Write(Wall+#8) else Write(' '#8);<br> If (FX = WhereX) and (FY = WhereY) then FX := 0<br> End;<br> #83: {Del}<br> Begin<br> If WhereX > 1 then GotoXY(WhereX-1, WhereY);<br> If Mem[$B800:WhereY*160+WhereX*2] = 32 then<br> Write(Wall+#8) else Write(' '#8);<br> If (FX = WhereX) and (FY = WhereY) then FX := 0<br> End;<br> #81: {PgDn}<br> Begin<br> If WhereX < 78 then GotoXY(WhereX+1, WhereY);<br> If Mem[$B800:WhereY*160+WhereX*2] = 32 then<br> Write(Wall+#8) else Write(' '#8);<br> If (FX = WhereX) and (FY = WhereY) then FX := 0<br> End;<br> #79: {End}<br> Begin<br> If WhereY < 48 then GotoXY(WhereX, WhereY+1);<br> If Mem[$B800:WhereY*160+WhereX*2] = 32 then<br> Write(Wall+#8) else Write(' '#8);<br> If (FX = WhereX) and (FY = WhereY) then FX := 0<br> End;<br> #59: {F1 - Clr}<br> Begin<br> For j := 1 to 48 do<br> For i := 1 to 78 do<br> Begin<br> GotoXY(i, j);<br> Write(' '#8)<br> End;<br> FX := 0<br> End;<br> #60: {F2 - Fill}<br> Begin<br> For j := 1 to 48 do<br> For i := 1 to 78 do<br> Begin<br> GotoXY(i, j);<br> Write(Wall+#8)<br> End;<br> FX := 0<br> End;<br> #73: {PgUp}<br> Write('X'#8);<br> #82: {Ins}<br> Begin<br> i:= WhereX;<br> j := WhereY;<br> GotoXY(FX, FY);<br> Write(' ');<br> GotoXY(i, j);<br> Write(#1#8);<br> FX := i;<br> FY := j<br> End<br> End;<br> #09: {Tab}<br> For Ni := 1 to 100 do<br> Begin<br> i := Random(78)+1;<br> j := Random(48)+1;<br> If Mem[$B800:j*160+i*2] <> 1 then<br> Begin<br> GotoXY(i, j);<br> Write(Wall+#8)<br> End<br> End;<br> #32: {Space}<br> Begin<br> If Mem[$B800:WhereY*160+WhereX*2] = 32 then<br> Write(Wall+#8) else Write(' '#8);<br> If (FX = WhereX) and (FY = WhereY) then FX := 0<br> End;<br> #13: {Enter}<br> If FX <> 0 then Start;<br> #27: {Esc}<br> Break<br> End<br> Until False;<br> TextMode(Co80);<br> TextAttr := 7;<br> ClrScr<br>End. |
Сообщ.
#3
,
|
|
|
Я не понимаю вопроса. Сказано - надо разработать алгоритм. В сабже стоит название алгоритма, который замечательным образом решает поставленную задачу. В чём проблема? Реализовать?
|
Сообщ.
#4
,
|
|
|
А причём тут дельфя вообще, тему ИМХО в алгоритмы надо.
|
Сообщ.
#5
,
|
|
|
Волновой алгоритм:
Program Voln;<br><br>Uses Crt;<br><br>Const<br><br> Map : array [1..10, 1..10] of Byte =<br><br> (<br><br> (0, 0, 1, 0, 0, 0, 0, 0, 0, 0),<br><br> (1, 0, 0, 0, 0, 1, 0, 0, 1, 0),<br><br> (0, 0, 0, 1, 1, 1, 0, 0, 1, 1),<br><br> (0, 1, 0, 0, 0, 1, 0, 0, 1, 0),<br><br> (0, 0, 0, 0, 1, 1, 1, 0, 1, 0),<br><br> (0, 0, 1, 1, 1, 0, 1, 0, 0, 0),<br><br> (0, 0, 0, 1, 0, 0, 1, 0, 0, 0),<br><br> (1, 1, 0, 1, 0, 0, 1, 1, 1, 0),<br><br> (0, 1, 0, 0, 0, 0, 1, 0, 0, 0),<br><br> (0, 1, 0, 0, 0, 0, 1, 0, 0, 0)<br><br> );<br><br>var<br><br> XS, YS, XE, YE : Byte;<br><br> X, Y, I : Byte;<br><br> MapM : array [1..10, 1..10] of Byte;<br><br> Moves : Byte;<br><br> MovesX : array [1..100] of Byte;<br><br> MovesY : array [1..100] of Byte;<br><br>Procedure Next(Var X, Y : Byte);<br><br>Begin<br><br> If (X <10) and (MapM[X, Y] - MapM[X + 1, Y] = 1) then<br><br> Begin<br><br> X := X + 1;<br><br> Exit;<br><br> End;<br><br> If (X >1) and (MapM[X, Y] - MapM[X - 1, Y] = 1) then<br><br> Begin<br><br> X := X - 1;<br><br> Exit;<br><br> End;<br><br> If (Y <10) and (MapM[X, Y] - MapM[X, Y + 1] = 1) then<br><br> Begin<br><br> Y := Y + 1;<br><br> Exit;<br><br> End;<br><br> If (Y >1) and (MapM[X, Y] - MapM[X, Y - 1] = 1) then<br><br> Begin<br><br> Y := Y - 1;<br><br> Exit;<br><br> End;<br><br>End;<br><br>Begin<br><br> ClrScr;<br><br> For Y := 1 to 10 do<br><br> Begin<br><br> For X := 1 to 10 do Write(Map[X, Y], ' ');<br><br> WriteLn;<br><br> End;<br><br> WriteLn('Please enter X and Y of the start: ');<br><br> ReadLn(XS, YS);<br><br> WriteLn('Please enter X and Y of the end: ');<br><br> ReadLn(XE, YE);<br><br> If (Map[XS, YS] = 1) or (Map[XE, YE] = 1) then<br><br> Begin<br><br> WriteLn('Error!!!');<br><br> ReadLn;<br><br> Halt;<br><br> End;<br><br> MapM[XS, YS] := 1;<br><br> I := 1;<br><br> Repeat<br><br> I := I + 1;<br><br> For Y := 1 to 10 do<br><br> For X := 1 to 10 do<br><br> If MapM[X, Y] = I - 1 then<br><br> Begin<br><br> If (Y <10) and (MapM[X, Y + 1] = 0) <br>and (Map[X, Y+1] = 0) Then MapM[X, Y+1] := I;<br><br> If (Y >1) <br>and (MapM[X, Y-1] = 0) and (Map[X, Y-1] = 0) Then MapM[X, Y-1] := I;<br><br> If (X <10) <br>and (MapM[X+1, Y] = 0) and (Map[X+1, Y] = 0) Then MapM[X+1, Y] := I;<br><br> If (X >1) <br>and (MapM[X-1, Y] = 0) and (Map[X-1, Y] = 0) Then MapM[X-1, Y] := I;<br><br> End;<br><br> If I = 100 then<br><br> Begin<br><br> WriteLn('You can''t go there!!!');<br><br> ReadLn;<br><br> Halt;<br><br> End;<br><br> Until MapM[XE, YE] >0;<br><br> Moves := I - 1;<br><br> X := XE;<br><br> Y := YE;<br><br> I := Moves;<br><br> Map[XE, YE] := 4;<br><br> Repeat<br><br> MovesX[I] := X;<br><br> MovesY[I] := Y;<br><br> Next(X, Y);<br><br> Map[X, Y] := 3;<br><br> I := I - 1;<br><br> Until (X = XS) and (Y = YS);<br><br> Map[XS, YS] := 2;<br><br> For I := 1 to Moves do WriteLn('X = ', MovesX[I],', Y = ', MovesY[I]);<br><br> WriteLn('Total: ', Moves, ' moves');<br><br> ReadLn;<br><br> For Y := 1 to 10 do<br><br> Begin<br><br> For X := 1 to 10 do Write(Map[X, Y], ' ');<br><br> WriteLn;<br><br> End;<br><br> ReadLn;<br><br>End.<br> |
Сообщ.
#6
,
|
|||
|
На Паскале очень даже ничего... Я захотел посмотреть, что тут делается, запустил под ХР найденый в сети ТР 7.0, а он на эту программу (впрочем и на нижнюю тоже) ругается давно не виданным сообщением: Деление на нуль, ошибка 200. При этом родные туториалы компилит и исполняет нормально, то есть сам Пасик не битый. В чем моя ошибка? Откуда "груз 200"? |
Сообщ.
#8
,
|
|
|
А дату создания темы ты см. ?;) Не понимаю, зачем надо давать ответ на вопрос, заданный хз когда, да ещё и при наличии нескольких полных ответов в теме;)
|
Сообщ.
#9
,
|
|
|
А кто на дату создания смотрит?
Смотрят по последней дате. Последняя 16.11.03. Алгоритма нету? Нету. Вот и привел ссылку. Ссылку кстати еще ты мне подкинул дааавненько... Вот и пригодилась. |