<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=10_2018_Lectia17</id>
	<title>10 2018 Lectia17 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/index.php?action=history&amp;feed=atom&amp;title=10_2018_Lectia17"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia17&amp;action=history"/>
	<updated>2026-04-13T13:13:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia17&amp;diff=16022&amp;oldid=prev</id>
		<title>Bella: /* Tema */</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia17&amp;diff=16022&amp;oldid=prev"/>
		<updated>2019-03-06T12:36:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Tema&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=BFS ( Algoritmul lui Lee )=&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Fie o harta reprezentata de catre o matrice de dimensiuni n * m. Elementele matricei vor fi: 0 pentru celule cu obstacole,&lt;br /&gt;
1 pentru celule goale.&lt;br /&gt;
Sa se determine punctul cel mai indepartat de pe harta fata de un punct dat P (x1,y1).&lt;br /&gt;
Lungimea drumului va fi determinata de catre numarul de casute pe care trebuie sa le traversez, plecând din P, pana la acel punct,&lt;br /&gt;
fara a trece prin casute in care avem obstacole.&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#define MAX_N 100&lt;br /&gt;
#define MAX_M 100&lt;br /&gt;
&lt;br /&gt;
int a[MAX_N + 2][MAX_M + 2];   //adaugam 2 linii, doua coloane pentru bordare&lt;br /&gt;
int dist[MAX_N + 2][MAX_M + 2];  //matricea in care calculam distantele de la&lt;br /&gt;
//    812                        //Ordinea in care am definit vecinii&lt;br /&gt;
//    7x3&lt;br /&gt;
//    654&lt;br /&gt;
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};&lt;br /&gt;
int dy[] = { 0,  1, 1, 1, 0,-1,-1, -1};&lt;br /&gt;
&lt;br /&gt;
int lin[MAX_N * MAX_M];&lt;br /&gt;
int col[MAX_N * MAX_M];&lt;br /&gt;
int vf, sf;&lt;br /&gt;
int main(void) {&lt;br /&gt;
  int n, m, i, j, l, c ;&lt;br /&gt;
  FILE *fin = fopen( &amp;quot;mat.in&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
  // citirea datelor; construim harta in matricea a; matricea este initializata cu 0 deci este deja bordata.&lt;br /&gt;
  fscanf(fin, &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
  for (i = 1; i &amp;lt;= n; ++i)&lt;br /&gt;
    for (j = 1; j &amp;lt;= m; ++j)&lt;br /&gt;
      fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;a[i][j]);&lt;br /&gt;
&lt;br /&gt;
  int L, C;&lt;br /&gt;
  fscanf(fin,&amp;quot;%d %d&amp;quot;, &amp;amp;L, &amp;amp;C);  //punctul de la care doresc calculul distantelor&lt;br /&gt;
&lt;br /&gt;
  // calcularea solutiei;&lt;br /&gt;
  for (i = 0; i &amp;lt;= n + 1; ++i)&lt;br /&gt;
    for (j = 0; j &amp;lt;= m + 1; ++j)&lt;br /&gt;
      dist[i][j] = -1;          //initial toate distantele sunt necalculate&lt;br /&gt;
  dist[L][C] = 0;               //distanta de la punctul initial la el insusi este 0&lt;br /&gt;
&lt;br /&gt;
  vf = sf = 0;                 //initial coada e vida; varful cozii coincide cu sfarsitul ei; sf tine minte cate elem am in coada&lt;br /&gt;
  lin[sf] = L;                //introducem coordonatele punctului de plecare in coada&lt;br /&gt;
  col[sf] = C;&lt;br /&gt;
  sf++;                         //coada contine 1 element acum&lt;br /&gt;
  while (vf &amp;lt; sf) {             //cata vreme mai am elemente in coada de analizat&lt;br /&gt;
    for (i = 0; i &amp;lt; 8; ++i){    //vizitam toate elementele vecine elementului curent ( cel de la coord stocate in varful cozii)&lt;br /&gt;
      l=lin[vf]+dx[i];          //coordonatele vecinului i&lt;br /&gt;
      c=col[vf]+dy[i];&lt;br /&gt;
      if (a[l][c] == 1 &amp;amp;&amp;amp; dist[l][c] == -1) {   //daca elementul vecin nu are obstacol si distata pana la el nu este calculata&lt;br /&gt;
        dist[l][c] = dist[lin[vf]][col[vf]] + 1; //distanta pana la vecin este distanta pana la elem. curent  + 1&lt;br /&gt;
        lin[sf] = l;                     //punem vecinul i in coada&lt;br /&gt;
        col[sf] = c;&lt;br /&gt;
        sf++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    vf++;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // afisarea solutiei : aifsam toate distantele: dist[i][j] = distanta de la a[L][C] la a[i][j]&lt;br /&gt;
  //am marcat cu x casutele obstacol.&lt;br /&gt;
  for (i = 1; i &amp;lt;= n ; ++i) {&lt;br /&gt;
    for (j = 1; j &amp;lt;= m ; ++j) {&lt;br /&gt;
      if (dist[i][j] == -1) {&lt;br /&gt;
        printf(&amp;quot;x &amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
        printf(&amp;quot;%1d &amp;quot;, dist[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
6 8&lt;br /&gt;
0 0 0 0 0 0 0 0&lt;br /&gt;
0 1 0 1 1 0 0 0&lt;br /&gt;
0 1 0 1 1 1 0 0&lt;br /&gt;
0 1 1 1 1 0 0 0&lt;br /&gt;
0 0 1 0 1 1 0 0&lt;br /&gt;
0 0 0 0 0 0 0 0&lt;br /&gt;
3 4&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [http://varena.ro/problema/alee alee] ==&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_N 175&lt;br /&gt;
&lt;br /&gt;
int a[MAX_N + 2][MAX_N + 2];&lt;br /&gt;
&lt;br /&gt;
int dx[] = { 1, -1,  0,  0, };&lt;br /&gt;
int dy[] = { 0,  0,  1, -1, };&lt;br /&gt;
&lt;br /&gt;
//coada in care punem coordonatele catutelor parcurse&lt;br /&gt;
int l[MAX_N * MAX_N];&lt;br /&gt;
int c[MAX_N * MAX_N];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin = fopen( &amp;quot;alee.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  FILE *fout = fopen( &amp;quot;alee.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  int n, m, i, j, in, sf;&lt;br /&gt;
  int x, y, L1, C1, L2, C2;;&lt;br /&gt;
&lt;br /&gt;
  fscanf(fin, &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m);         // n - dim matricei, m - nr de copaci&lt;br /&gt;
  for (i = 0; i &amp;lt; m; i++) {             // citim coordonatele celor m copaci&lt;br /&gt;
    fscanf( fin, &amp;quot;%d %d&amp;quot;, &amp;amp;x, &amp;amp;y);&lt;br /&gt;
    a[x][y] = 1;                       // marcam in matrice copacul cu 1&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  fscanf( fin, &amp;quot;%d %d&amp;quot;, &amp;amp;L1, &amp;amp;C1);     //coordonatele portii de intrare&lt;br /&gt;
  fscanf( fin, &amp;quot;%d %d&amp;quot;, &amp;amp;L2, &amp;amp;C2);     //coordonatele portii de iesire&lt;br /&gt;
&lt;br /&gt;
  //Bordarea matricei patratice&lt;br /&gt;
  for ( i = 0; i &amp;lt;= n + 1; i++ )&lt;br /&gt;
	  a[0][i] = a[n + 1][i] =a[i][0] = a[i][n + 1] = 1;&lt;br /&gt;
&lt;br /&gt;
  //BFS&lt;br /&gt;
  a[L1][C1] = 1;    // punem in matrice dimensiunea aleii de la poarta de intrare la ea insasi&lt;br /&gt;
  l[0] = L1;        // punem ca prim element in coada, coordonatele portii de intrare&lt;br /&gt;
  c[0] = C1;&lt;br /&gt;
  sf = 1;           // sfarsitul cozii; avem in coada un singur element&lt;br /&gt;
  in = 0;           // pozitia elementuluu din coada curent.&lt;br /&gt;
  while ( in &amp;lt; sf &amp;amp;&amp;amp; a[L2][C2] == 0 ) {// cata vreme mai am elemente in coada si cata vreme nu am calculat drumul pana la poarta de iesire&lt;br /&gt;
    for ( i = 0; i &amp;lt; 4; i++ ){         // parcugem toti vecinii&lt;br /&gt;
      x = l[in] + dx[i];               // calculam linia si coloana vecinului&lt;br /&gt;
      y = c[in] + dy[i];&lt;br /&gt;
      if ( a[x][y] == 0 ) {            // daca nu am copac si inca nu am calculat distanta pana aici&lt;br /&gt;
        a[x][y] = a[l[in]][c[in]] + 1;      // lungimea pana aici e lungimea casutei prin care am ajuns + 1&lt;br /&gt;
        l[sf] = x;                          // punem coordonatele casutei in coada&lt;br /&gt;
        c[sf] = y;&lt;br /&gt;
        sf ++;                              // crestem dimenziunea cozii&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    in ++;                                  // trecem la urmatorul element de analizat din coada&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // afisarea solutiei&lt;br /&gt;
  fprintf(fout, &amp;quot;%d\n&amp;quot;, a[L2][C2]);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema =&lt;br /&gt;
* [http://varena.ro/problema/panda panda]&lt;br /&gt;
* [http://varena.ro/problema/insule insule]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>