Teorie si probleme Backtracking in plan

Embed Size (px)

Citation preview

  • 8/20/2019 Teorie si probleme Backtracking in plan

    1/8

    Backtracking in plan

    Fie urmatoare problema: un soricel se gaseste intr-un labirint de forma dreptunghiulara cum linii si n coloane. Peretii sunt marcati cu 1 si culoarele cu 0. Se cunosc coordonatele initiale

    ale soricelului: Li, Ci. Sa se determine toate posibilitatile pe care le are soricelul pentru a iesi din

    labirint. Soricelul poate avansa pe directii cate o celula !sus, dreapta , "os, stanga#.$ astfel de problema presupune o abordare %ac&trac&ing in plan. 'raseul soricelului va fi

    retinut de un vector cu doua campuri: coordonatele ( si ). *om defini un tip struct:

    struct pozitie

    {int x,y;};

    si vom declara un vector care retine drumul: pozitie d[50];

    Pentru generarea unui drum vom defini un subprogram recursiv oid ies(int x,int y) care

     primeste ca parametri coordonatele unei componente din matrice. +nitial se apeleaa pentru

    coordonatele initiale ale soricelului. $ componenta din matrice va putea apartine drumului dacaevident este culoar !a()/0#. $ celula a matricii determinata ca apartinand drumului se

    marcheaa cu !pentru a preveni ciclarile#:

    a()/

    Se incarca valoarea corespunatoare in vectorul d pe nivelul curent:d&.(/(

      d&.)/)

     2e fiecare data cand s-a determinat o noua celula ca apartinand drumului se determinadaca s-a a"uns la solutie !conditie care difera de la o problema la alta#.

    +n caul probemei noastre se iese din labirint cand se a"unge la linia 0 sau coloana 0 saulinia m31 sau coloana n31. testul este:

    if!!(41#55!(6m#55!)41#55!)6n##

     tipar!

     +n ca afirmativ se tipareste !se afiseaa vectorul d si7sau matricea a# altfel !daca solutia

    este incompleta# se incearca parcurgerea, pe rand, a celor celule alaturate. 8cest lucru se

    realieaa prin autoapelul functiei ies pe cele patru directii:

    ies!(-1,)#

    ies!(,)31#ies!(31,)#

    ies!(,)-1#

    $bservatie: vectorul d functioneaa ca o stiva cu doua campuri.

     La revenire din apel se elibereaa celula pentru a o putea accesa si in cadrul altor 

     prelucrari: a[x][y]=0 si se elibereaa componenta drumului k=k-1 !practic se coboara in stiva#.

  • 8/20/2019 Teorie si probleme Backtracking in plan

    2/8

    void ies!int (,int )#

    9if!a()//0#

      9&33  a()/

      d&.(/(

      d&.)/)  if!!(41#55!(6m#55!)41#55!)6n##

     tipar!

      else  9ies!(-1,)#

    ies!(,)31#

    ies!(31,)#

    ies!(,)-1# 

      a()/0 77la revenire din apel demarche celula pentru a o putea

    77accesa si in cadrul altei prelucrari

      &-- 77elibere componenta din vectorul drumului 

    Fie urmatorul labirint: m/; n/10 Li/, Ci/<

    1 1 1 1 0 1 1 1 1 1

    1 1 1 1 0 1 1 1 1 1

    1 1 1 1 0 1 1 1 1 1

    1 1 0 0 0 0 0 0 0 01 1 1 1 1 1 1 0 1 1

    1 1 1 1 1 1 1 0 1 1

    Solutiile vor fi:

    solutia 1

    !,

  • 8/20/2019 Teorie si probleme Backtracking in plan

    3/8

    solutia

    !,# !,?# !,@# !,10# !,11#

    1 1 1 1 0 1 1 1 1 1

    1 1 1 1 0 1 1 1 1 11 1 1 1 0 1 1 1 1 1

    1 1 1 1 1 1 1 1 1 0 1 11 1 1 1 1 1 1 0 1 1

    solutia <

    !,# !,?# !=,?# !;,?# !>,?#

    1 1 1 1 0 1 1 1 1 1

    1 1 1 1 0 1 1 1 1 11 1 1 1 0 1 1 1 1 1

    1 1  0 01 1 1 1 1 1 1  1 1

    1 1 1 1 1 1 1  1 1

    Programul complet este:

    Ainclude4fstream.h6

    ofstream fout!Blabirint.outB#

    struct poitie9int (,)

    int a0077labirintul

    int &,n,m,Li,Ci,nrsol

     poitie d=0

    void afismat!# 77afiseaa matricea

    9fout44DEnD for!int i/1i4/mi33#

      9for!int "/1"4/n"33#

      fout44ai"44B B  fout44DEnD

     

  • 8/20/2019 Teorie si probleme Backtracking in plan

    4/8

    void tipar!int 77tipareste vectorul drum

    9nrsol33

    fout44Bsolutia B44nrsol44DEnDfor!int i/1i4/&i33#

      fout44B!B44di.(44D,D44di.)44B# B

    afismat!#fout44DEnD

    void ies!int (,int )# 77genereaa drumul

    9if!a()//0#

      9&33

      a()/  d&.(/(

      d&.)/)

      if!!(41#55!(6m#55!)41#55!)6n##

     tipar!  else

    9ies!(-1,)#

    ies!(,)31#

    ies!(31,)#ies!(,)-1#

      a()/0 77la revenire din apel demarche celula pentru a o putea

    77accesa si in cadrul altei prelucrari  &--77elibere componenta din vectorul drumului

     

    void citire!#

    9ifstream fin!Blabirint.inB#

    fin66m66n

    for!int i/1i4/mi33#

    for!int "/1"4/n"33#fin66ai"

    fin66Li66Ci 77coordonatele punctului in care se afla soricelul

    int main!#9

    citire!#

    ies!Li,Ci#

  • 8/20/2019 Teorie si probleme Backtracking in plan

    5/8

    Probleme propuse:

    1. aceeasi problema ca in e(emplu cu diferenta ca soricelul poate avansa in celule alaturate pe cele ?

    directii posibile

    . n soricel se gaseste intr-un labirint de forma dreptunghiulara cu m linii si n coloane. Peretii sunt

    marcati cu 1 si culoarele cu 0. Se cunosc coordonatele initiale ale soricelului: Li, Ci. Sa se determine toate

     posibilitatile pe care le are soricelul pentru a iesi a"unge la cascaval. Se cunosc coordonatele cascavalului:Lf,Cf.

    . Sa se completee o tabla de =N= cu saritura calului.

    +ata doua solutii:

    8flati numarul de solutii si afisati tablele.

    ?. Se da un tablou bidimensional !m linii, n coloane si mNn componente# cu elemente distincte. Se dau

    si coordonatele primului punct. Ss se generee un traseu in matrice pornind de la punctul dat astfel incat

    suma O &Nai" !unde &/1 nNm # sa fie ma(ima. +n matrice se poate avansa numai la elemente vecine

    !pe cele ? directii#.

    1 1 @ 0 <

    1@ 1= 10

    1< ? = 1

    1? < ; 11 1;

    > 1 1> =

    1 1 @ 0 <

    1@ 1= 10

    1< ? < 1

    1? = ; 11 1;

    > 1 1> =

  • 8/20/2019 Teorie si probleme Backtracking in plan

    6/8

    (: n/m/poitia initiala : linia

    Suma ma(ima va fi: 1N13N3

  • 8/20/2019 Teorie si probleme Backtracking in plan

    7/8

    Sa se afisee solutia cea mai lunga !scurta#

    11. n labirint dreptunghiular cu m linii si n coloane contine culoare !repreentate prin 0# si pereti

    !repreentati prin 1#. Se dau coordonatele initiale ale unui soricel care trebuie sa iasa din labirint.S8 se

    generee toate solutiile

    1. n labirint dreptunghiular cu m linii si n coloane contine culoare !repreentate prin 0# si pereti

    !repreentati prin -1#. Se dau coordonatele initiale ale unui soricel si coordonatele finale , unde trebuie sa

    a"unga. Pe culoare se gasesc bucati de brana pt care se cunoaste greutatea in grame.

    Sa se generee toate solutiile., pt fiecare se afiseaa cantitatea consumata

    Sa se afisee soultia cea mai GconsistentaH

    1

  • 8/20/2019 Teorie si probleme Backtracking in plan

    8/8

    Scrieti un program care sa determine un traseu al soarecelui care sa aiba cel putin lungimea nmin si care

    sa nu treaca de doua ori prin aceeasi camera. 'raseul va incepe din camera initiala a soarecelui si se va

    termina intr-o camera care are usa spre iesirea din labirint.

    !ate de intrare

    Fisierul de intrare labirint.in contine pe prima linie doua numere naturale separate printr-un spatiu n si m

    cu semnificatia din enunt. Pe fiecare dintre urmatoarele n linii se afla cate m numere naturale separate

     prin spatii, repreentand codificarea labirintului. Pe urmatoarea linie a fisierului de intrare se afla doua

    numere naturale separate printr-un spatiu L0 si C0, repreentand linia si coloana corespunatoare camerei

    in care se afla initial soarecele. ltima linie a fisierului de intrare contine numarul minim de camere prin

    care trebuie sa treaca soarecele soarecele Unainte de a parasi labirintul.

    !ate de iesire

    Fisierul de iesire labirint.out va contine pe prima linie un numar natural Lg, repreentand numarul de

    camere pe care le poate viita soarecele pana la iesire, fara a trece de mai multe ori prin aceeasi camera si

    trecand prin cel putin nmin camere. Pe urmatoarele Lg linii se afla cate doua numere naturale separate

     printr-un spatiu L C, repreentand coordonatele camerelor !linie, coloana# prin care trece soarecele pe

    traseul determinat.

    *estrictii

    • 0 4 n, m 4/ =0

    • Pentru datele de test problema are intotdeauna solutie.

    +xeple

    la.irint%in la.irint%out +xplicatii

    = ;

    1 < 5 ;

    > ? @ 10 11 1

    1< 1 1= 1/ 1 1?

    1@ 0 1  <

    = ; > ? @