Dale
Участник
|
MzSpider Попробовал вникнуть в суть задачи нарисовть схемку схемка внешняя ссылка удалена Задача на вычисление кратчайшего пути. У нас есть К вселенных; на вселенной, от которой начинается отсчет, располагается N планет. На планетах бывают порталы на другие планеты. Чтобы переместится на другую планету с помощью портала, нужна таблетка. Чтобы переместится между двумя порталми внутри планеты (на дирижабле), нудно love. Причем стоимость между любой парой порталов может быть разная. (Сообщение отредактировал Dale 21 сен. 2009 9:11)
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 21 сен. 2009 9:10 | IP
|
|
zhumadilov
Новичок
|
Цитата: Dale написал 21 сен. 2009 8:30 спс
|
Всего сообщений: 2 | Присоединился: сентябрь 2009 | Отправлено: 22 сен. 2009 9:37 | IP
|
|
MzSpider
Новичок
|
Я на олимпиаде вот эту задачу не решил , здесь походу процедура вызывает саму себя и ищет оптимальный вариант
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 23 сен. 2009 14:08 | IP
|
|
Dale
Участник
|
можно через и через рекурсию, но можно ее и обойти.. Как нибудь попробую решить ее на досуге
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 24 сен. 2009 15:47 | IP
|
|
lolth
Новичок
|
Все решения тут: внешняя ссылка удалена
|
Всего сообщений: 24 | Присоединился: сентябрь 2009 | Отправлено: 25 сен. 2009 18:59 | IP
|
|
MzSpider
Новичок
|
Памагите дорешать , надо в ламберинте искать выход (комп сам ишет), я написал только на кнопках передвигаться вот код : uses crt; label m0, m1, m2; var mas : array [1..80, 1..25] of char; f : text; x, y : byte; mx, my : byte; px, py : byte; ky : char; map : byte; IsLast : byte; systemtimer:longint absolute $0040:$006C; procedure delau(t:longint); var n,p:longint; begin x:=0; n:=systemtimer; while ((p-n)/18.2)*1000<p do p:=systemtimer; end; function IsMovPosible (dir : byte) : boolean; begin IsMovPosible := false; if (dir = 1) and (mas[px, py - 1] <> '1') then IsMovPosible := true; if (dir = 2) and (mas[px, py + 1] <> '1') then IsMovPosible := true; if (dir = 3) and (mas[px - 1, py] <> '1') then IsMovPosible := true; if (dir = 4) and (mas[px + 1, py] <> '1') then IsMovPosible := true; end; procedure LoadMap(MapNum : byte); var mn : string; begin str(MapNum, mn); assign(f , 'c:\game\stage' + mn + '.bag'); reset(f); readln(f, mx); readln(f, my); readln(f, IsLast); for y := 1 to my do begin for x := 1 to mx - 1 do begin read(f, mas[x, y]); if mas[x,y] = '2' then begin px := x; py := y; end; end; readln(f, mas[x + 1, y]); end; close(f); end; begin map := 1; m0: clrscr; LoadMap(map); for y := 1 to my do begin for x := 1 to mx do begin gotoxy(x, y); if mas[x, y] = '1' then write ('Ы'); if mas[x, y] = '2' then write ('M'); if mas[x, y] = '3' then write ('‹'); end; end; m1: ky := readkey; gotoxy(px, py); write(' '); if (ky = '8') and (py > 1) and IsMovPosible(1) then py := py - 1; if (ky = '2') and (py < 25) and IsMovPosible(2) then py := py + 1; if (ky = '4') and (px > 1) and IsMovPosible(3) then px := px - 1; if (ky = '6') and (px < 79) and IsMovPosible(4) then px := px + 1; gotoxy(px,py); write('M'); if mas[px,py] = '3' then begin clrscr; writeln('Minotavr zashel v JIogovo'); readln; if IsLast = 1 then goto m2; map := map + 1; goto m0; end; if (ky = 'q') or (ky = 'Q') then goto m2; goto m1; m2: readln; end.
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 26 сен. 2009 13:58 | IP
|
|
MzSpider
Новичок
|
Пример Фаила : 5 5 0 11111 12001 11101 13001 11111
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 26 сен. 2009 14:00 | IP
|
|
MzSpider
Новичок
|
1 - стенка 2 - минотавр(чел) 3 - выход
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 26 сен. 2009 14:02 | IP
|
|
Dale
Участник
|
MzSpider Мой совет: никогда.... Никогда! не используй метки. От них ничего, кроме проблем... И их всегда можно обойти. Предлагаю такой код к вашей задаче:
Code Sample:
uses crt; var mas : array [1..80, 1..25] of char; f : text; x, y : byte; mx, my : byte; px, py : byte; ky : char; c:char; map : byte; IsLast : byte; i,j,k,k2:integer; function IsMovPosible (dir : byte) : boolean; var b:boolean; begin b:=false; case dir of 1: {up} b:=mas[px, py - 1] <> '1'; 2: {down} b:=mas[px, py + 1] <> '1'; 3: {JIEBO}b:=mas[px-1,py]<>'1'; 4: {npaBo}b:=mas[px+1,py]<>'1'; end; IsMovPosible:=b; end; function IsNextLevel:boolean; begin IsNextLevel:= mas[px,py]='3' end; procedure LoadMap(MapNum : byte); var mn : string; begin str(MapNum, mn); assign(f , 'c:\game\stage' + mn + '.bag'); reset(f); readln(f, mx); readln(f, my); readln(f, IsLast); i:=1; j:=1; while i<=mx do begin while j<=my do begin read(f,c); if (ord(c)<>13) and (ord(c)<>10) then begin mas[j,i]:=c; if (c='2') then begin px:=i; py:=j; mas[i,j]:='0'; end; j:=j+1; end; end; i:=i+1; j:=1; end; close(f); end; procedure write_map; begin for j:=1 to mx do begin for i:=1 to my do case (mas[i,j]) of '1':write(#219); '2':write(#2); '3':write(#31); '0':write(' '); end;{case} writeln; end; end; function getXY:integer; var b:integer; begin {пол. куда двигаться: вверх, низ, лево или прво} while not IsMovPosible(b) do b:=random(4)+1; getXY:=b; end; begin map := 1; clrscr; randomize; LoadMap(map); while true do begin clrscr; write_map; gotoxy(px,py); write(#2); if IsNextLevel then begin clrscr; writeln('Минотавр зашел в логово'); if IsLast = 1 then begin readkey; halt; end; map:=map+1; LoadMap(map); end; {Это если клавиши} {c:=readkey; case c of #27:halt; #72:if IsMovPosible(1) then py:=py-1; #80:if IsMovPosible(2) then py:=py+1; #75:if IsMovPosible(3) then px:=px-1; #77:if IsMovPosible(4) then px:=px+1; end;} {а это если случайное направление} k:=getXY; case k of 1:if IsMovPosible(1) then py:=py-1; 2:if IsMovPosible(2) then py:=py+1; 3:if IsMovPosible(3) then px:=px-1; 4:if IsMovPosible(4) then px:=px+1; end; sound(5000); delay(500); nosound; delay(30000); end; end.
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 26 сен. 2009 20:57 | IP
|
|
Dale
Участник
|
Тут я реализовал пока что движение минотавра в случайном направлении. комментарии IsNextLevel определяет, зашел минотавр в логово или нет write_map выводит массив с картой getXY выдает направление (пока случайное) от 1 до 4 в самой программе бесконечный цикл В нем действия развиваются по следующему алгоритму: 1) очистка экрана 2) вывод карты 3) вывод человечка 4) определение следующих координат человечка. Выход из цикла осуществляется с помощью процедуры halt.
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 26 сен. 2009 21:08 | IP
|
|
|