Cod sursa(job #232298)

Utilizator oltean_florinoltean florin-ioan oltean_florin Data 14 decembrie 2008 23:26:25
Problema Tablete Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>

using namespace std;

int punct(int n, int i, int j) {
  return (i-1)*n + j;
}

int sus(int n, int i, int j) {
  //punct(n, i-1, j)
  return (i-2)*n + j;
}

int jos(int n, int i, int j) {
  return i*n + j;
}

int stanga(int n, int i, int j) {
  return (i-1)*n + j - 1;
}

int dreapta(int n, int i, int j) {
  return (i-1)*n + j + 1;
}

void pp(ofstream &fout, int n) {
  int i, j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++)
      fout<<punct(n,i,j)<<" ";
          
    fout<<"\n";
  }
}

void pi(ofstream &fout, int n) {
  int i, j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) 
      if ( i % 2 == 1 ) {//linie impara - mutare la stanga - se iau elemente din drepta
        if ( j < n ) 
          fout<<dreapta(n, i, j)<<" ";
        else
          fout<<jos(n, i, j)<<" ";     
      } else {//linie para - mutare la drepta
        if ( j > 1 )
          fout<<stanga(n, i, j)<<" ";
        else
          fout<<sus(n, i, j)<<" ";    
      }
       
    fout<<"\n";
  }
}

void ip(ofstream &fout, int n) {
  int i, j;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++)
      fout<<punct(n,i,j)<<" ";
          
    fout<<"\n";
  }
}

void ii(ofstream &fout, int n, int k) {
  int i, j;
  int n2;
  if ( (n % 4 == 1) || (n % 4 == 2) ) //caz special
    n2 = n - n % 4 - 1;
  else 
    n2 = n;
  for (i = 1; i <= n2; i++) {
    for (j = 1; j <= n; j++)
      if ( i % 4 == 1 ) {//mutare la stanga
        if ( j < n )
          fout<<dreapta(n, i, j)<<" ";
        else
          fout<<punct(n, i+2, j)<<" ";      
      } else if ( i % 4 == 3 ) {//mutare la drepta
        if ( j > 1 )
          fout<<stanga(n, i, j)<<" ";
        else
          fout<<punct(n, i-2, j)<<" ";      
      } else {//nu se modifica nimic
        fout<<punct(n, i, j)<<" ";     
      }
    fout<<"\n";
  }
      
  //rezolvarea cazului special      
  for (i = n2 + 1; i <= n; i++) {
    for (j = 1; j <= n; j++)
      if ( i % 4 == 2 ) {
        fout<<punct(n, i, j)<<" ";     
      } else if ( i % 4 == 1 ){
        if ( j <= k )
          fout<<stanga(n, i, j)<<" ";
        else
          fout<<punct(n, i, j)<<" ";
      } else {//i % 4 == 0
        if ( j < n )
          fout<<punct(n, i, j)<<" ";
        else
          fout<<punct(n, i+1, k)<<" ";     
      }    
          
    fout<<"\n";
  }
}

int main() {

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

  int n, k;
     
  fin>>n>>k;
  
  if ( n % 2 == 0) {//n par
  
    if ( k % 2 == 0) //par par
      pp(fout, n);
    else //par impar
      pi(fout, n);
      
  } else {//n impar
  
    if ( k % 2 == 0) //impar par
      ip(fout, n);
    else //impar impar
      ii(fout, n, k);  
            
  } 
  
  return 0;  
}