Cod sursa(job #2703354)

Utilizator pifaDumitru Andrei Denis pifa Data 8 februarie 2021 12:27:29
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>

#define MAXN 9
#define MAXLAT 512

int nrdala;
int piata[MAXLAT][MAXLAT];

// coordonatele pomului sint relative la startl, startc - e mai simplu asa
void pavare( int startl, int startc, int n, int lpom, int cpom ) {
  int l, c, lcad, ccad, curent;

  if ( n > 1 ) {
    curent = nrdala++; // tinem minte dala de asezat pe centru
    n /= 2; // nu mai avem nevoie decit de dimensiunea pe jumate
    lcad = lpom / n; // coordonata linie cadran pom - 0 sau 1
    ccad = cpom / n; // coordonata coloana cadran pom - 0 sau 1
    for ( l = 0; l < 2; l++ ) // parcurgem cele 4 cadrane
      for ( c = 0; c < 2; c++ )
        if ( l == lcad && c == ccad )
          // problema care contine pomul
          pavare( startl + l*n, startc + c*n, n, lpom % n, cpom % n );
        else {
          // problema generala, nu contine pom, pavam cu 'curent'
          piata[startl + n - 1 + l][startc + n - 1 + c] = curent;
          pavare( startl + l*n, startc + c*n, n, (n-1)*(1-l), (n-1)*(1-c) );
        }
  }
}

int main() {
  FILE *fin, *fout;
  int n, l, c, lat;

  fin = fopen( "pav.in", "r" );
  fscanf( fin, "%d%d%d", &n, &l, &c );
  fclose( fin );

  lat = 1;
  while ( n-- > 0 )
    lat *= 2;
  nrdala = 1;
  pavare( 0, 0, lat, l-1, c-1 );

  fout = fopen( "pav.out", "w" );
  for ( l = 0; l < lat; l++ ) {
    for ( c = 0; c < lat; c++ )
      fprintf( fout, "%d ", piata[l][c] );
    fprintf( fout, "\n" );
  }
  fclose( fout );

  return 0;
}