Cod sursa(job #2893544)

Utilizator euyoTukanul euyo Data 26 aprilie 2022 09:20:20
Problema Piese Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fin( "piese.in" );
ofstream fout( "piese.out" );

const int DIM = 505;

int T[DIM][DIM];
int lg[DIM];
int cnt;

void cover( int l1, int c1, int l2, int c2 ) {
  if ( l1 > l2 || c1 > c2 ) return;
  if ( l1 == l2 ) {
	for ( int j = c1; j <= c2; ++j ) {
	  T[l1][j] = ++cnt;
	}
	return;
  }
  if ( c1 == c2 ) {
	for ( int i = l1; i <= l2; ++i ) {
	  T[i][c1] = ++cnt;
	}
	return;
  }
  int k = min(l2 - l1 + 1, c2 - c1 + 1);
  int q = (1 << lg[k]);
  ++cnt;
  for ( int i = l1; i < l1 + q; ++i ) {
	for ( int j = c1; j < c1 + q; ++j ) {
	  T[i][j] = cnt;
	}
  }
  cover( l1 + q, c1, l2, c1 + q-1 );
  cover( l1, c1 + q, l1 + q-1, c2 );
  cover( l1 + q, c1 + q, l2, c2 );
}

int main() {
  int n, m;

  fin >> n >> m;
  for ( int i = 2; i < DIM; ++i ) {
	lg[i] = lg[i / 2] + 1;
  }
  cover(0, 0, n-1, m-1);
  fout << cnt << "\n";
  for ( int i = 0; i < n; ++i ) {
	for ( int j = 0; j < m; ++j )  {
	  fout << T[i][j] << " ";
	}
	fout << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}