Advertisement
StefanPopescu

Divide et Impera - Bordarea cu L

Nov 18th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #include<fstream>
  2. #include<cstdio>
  3. #include<iostream>
  4. using namespace std;
  5. int k = 1;
  6. int M[100][100];
  7. void bordare(int startX, int startY, int n, int x, int y)
  8. {
  9.     if (n == 1)//daca n=1 aatunci am matrice 2X2
  10.     {
  11.         for (int i = startX; i <= startX + 1; i++)
  12.             for (int j = startY; j <= startY + 1; j++)
  13.                 if (i != x || j != y) M[i][j] = k;//parcurg matricea si bordez toate campurle mai putin cel pe care nu tb sa il acopar
  14.         k++;// dupa ce am acoperit cele 3 campuri, cresc k cu o unitate - simbolizand cum ca trec la urmatoarea piesa in forma de L
  15.         return;
  16.     }
  17.  
  18.     int i, j, dim = (1 << (n-1));
  19.     // dim -> lungimea laturii fiecarui sfert de matrice
  20.     if (x < startX + dim&&y < startY + dim) //cadranul stanga-sus
  21.     {
  22.             M[startX + dim][startY + dim] = M[startX + dim - 1][startY + dim] = M[startX + dim][startY + dim - 1] = k++;//cele 3 puncte din celelalte 3 cadrane
  23.             bordare(startX, startY, n - 1, x, y);//repet recursiv pt stanga sus
  24.             bordare(startX, startY + dim, n - 1, startX + dim - 1, startY + dim);//repet recursiv pt dreapta sus
  25.             bordare(startX + dim, startY, n - 1, startX + dim, startY + dim - 1);//repet recursiv pentru stanga jos
  26.             bordare(startX + dim, startY + dim, n - 1, startX + dim, startY + dim);//repet recursiv pentru dreapta jos
  27.            
  28.  
  29.  
  30.     }
  31.    
  32.     if (x < startX + dim&&y >= startY + dim)//cadranul din dreapta sus
  33.     {
  34.         M[startX + dim][startY + dim] = M[startX + dim - 1][startY + dim - 1] = M[startX + dim][startY + dim - 1] = k++;
  35.         bordare(startX, startY, n - 1, startX + dim - 1, startY + dim - 1);//repet recursiv pt stanga sus
  36.         bordare(startX, startY + dim, n - 1, x, y);//repet recursiv pt dreapta sus
  37.         bordare(startX + dim, startY, n - 1, startX + dim, startY + dim - 1);//repet recursiv pentru stanga jos
  38.         bordare(startX + dim, startY + dim, n - 1, startX + dim, startY + dim);//repet recursiv pentru dreapta jos
  39.     }
  40.  
  41.         if (x >= startX + dim&&y < startY + dim) //cadranul stanga-jos
  42.         {
  43.             M[startX + dim][startY + dim] = M[startX + dim - 1][startY + dim] = M[startX + dim - 1][startY + dim - 1] = k++;
  44.             bordare(startX, startY, n - 1, startX + dim - 1, startY + dim - 1);//repet recursiv pt stanga sus
  45.             bordare(startX, startY + dim, n - 1, startX + dim - 1, startY + dim);//repet recursiv pt dreapta sus
  46.             bordare(startX + dim, startY, n - 1, x, y);//repet recursiv pentru stanga jos
  47.             bordare(startX + dim, startY + dim, n - 1, startX + dim, startY + dim);//repet recursiv pentru dreapta jos
  48.         }
  49.  
  50.         if (x >= startX + dim &&y >= startY + dim) //cadranul dreapta-jos
  51.         {
  52.             M[startX + dim - 1][startY + dim - 1] = M[startX + dim - 1][startY + dim] = M[startX + dim][startY + dim - 1] = k++;
  53.             bordare(startX, startY, n - 1, startX + dim - 1, startY + dim - 1);//repet recursiv pt stanga sus
  54.             bordare(startX, startY + dim, n - 1, startX + dim - 1, startY + dim);//repet recursiv pt dreapta sus
  55.             bordare(startX + dim, startY, n - 1, startX + dim, startY + dim - 1);//repet recursiv pentru stanga jos
  56.             bordare(startX + dim, startY + dim, n - 1, x , y);//repet recursiv pentru dreapta jos
  57.         }
  58.  
  59. }
  60.  
  61. int main(){
  62.  
  63.     int n;
  64.     ifstream fin("intrare.txt");
  65.     fin >> n;
  66.     int x, y;
  67.     fin >> x >> y;
  68.     bordare(0, 0, n, x,y);
  69.  
  70.     //afisare:
  71.     for(int i=0;i<(1<<n);i++)
  72.     {   for (int j = 0; j < (1 << n); j++)
  73.        
  74.             printf("%3d", M[i][j]);
  75.     printf("\n");
  76.     }
  77.  
  78.     return 0;
  79.  
  80.  
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement