prezentare info robi

6

Click here to load reader

Upload: guest6be8ae

Post on 23-Jun-2015

319 views

Category:

Spiritual


4 download

TRANSCRIPT

Page 1: Prezentare Info Robi

Prezentare La

Informatica

Problema

Comis Voiajorului

Kukta Robertcl. a XI-a B

Page 2: Prezentare Info Robi

Enuntul Problemei

Un comis voiajor trebuie sa viziteze un numar n de orase. Initial se afla intr-una din ele. Acel oras este notat cu 1. Comis voiajorul doreste sa nu treaca de doua ori prin acelasi oras, iar la intoarcere sa revina in orasul 1. Cunoscand legaturile se cere sa se tipareasca toate

drumurile posibile pe care le poate efectua comisul voiajor

Page 3: Prezentare Info Robi

Algoritmul de rezolvare

- problema se rezorva prin metoda BACKTRACKING - pentru rezolvare se utilizeaza o stiva notata cu st - la nivelul 1 se gaseste numarul 1 Algoritmul continua pana cand se ajunge din nou la nivelul 1 caz in care algoritmul se incheie.

Observatii

Un succesor intre 2 si n aflat pe nivelul k este considerat valid daca:- Nu s-a mai trecut prin orasul simbolizat, deci nu se gaseste in stiva;

- Exista drum intre orasul aflat pe nivelul k-1 si orasul aflat pe nivelul k;- Cand stiva ajunge la nivelul k=n si sa existe drum de la orasul acesta la orasul 1

Page 4: Prezentare Info Robi

Exemplu Pentru n=6 Ai,j va fi: - 1 daca intre i si j se afla drum - 0 daca intre i si j nu se afla drum Si se va afisa in program:

1.2 Drumurile posibile sunt 2.3 12345612.5 12543612.6 16543212.1 16345213.43.53.63.24.54.35.65.25.35.4

Page 5: Prezentare Info Robi

program comis_voiajor;type stiva=array[1..100] of integer;

type mat= array[1..100,1..100] of integer;var st:stiva; a:mat;

as,ev:Boolean; n,k,i:integer;

Procedure init (k:integer;var st:stiva);Begin

St[k]:=1;End;

Procedure successor (var as:Boolean; var st:stiva;k:integer);Begin If st[k]<n then begin

As:=true;St[k]:=st[k]+1;

End Else as:=false;

End;Procedure valid(var ev:Boolean; st:stiva; k:integer);

Var i:integer;Begin

Ev := true;For i:=1 to k-1 do

If a[st[k-1],st[k]]=0 then ev:=false Else

For i:=1 to k-1 do If st[i]=st[k] then ev := false

Else If (k=n) and (a[1,st[k]]=0) then ev := false;

End;function solutie (k:integer):Boolean;

beginsolutie:=(k=n);

end;procedure tipar;

var i:integer;begin

for i:=1 to n do write( st[i]);end;

Page 6: Prezentare Info Robi

BEGINwrite(‘n=’);readln(n);for i:=1 to n do

for j:=1 to i-1 do begin write (‘a[‘,I,’,’,j,’]=’);readln(a[I,j]);

a[j,i]:=a[I,j];end;

st[1]:=1;k:=2;init(k,st);while k>1 do begin

repeatsuccessor (as,st,k);

if as then valid(ev,st,k);Until (not as) OR (as AND ev);If as then

If solutie(k) then tiparElse begin

K:=k+1;Init(k,st);End

Else k:=k+1;End;END.