Cod sursa(job #230963)

Utilizator ZeusCatalin Tiseanu Zeus Data 14 decembrie 2008 11:04:08
Problema Tablete Scor 100
Compilator cpp Status done
Runda Algoritmiada 2009, Runda 1, Clasele 5-8 Marime 1.85 kb

#include <cstdio>
#include <cstring>
#include <ctime>

int N, K, out[1001][1001], up[1001], low[1001];
char was[1001*1001];

int verify() {
    for ( int i = 1; i <= N; ++i )
        if ( out[i][K] % 2 )
           return 0;
           
    for ( int i = 1; i <= N; ++i )
        for ( int j = 2; j <= N; ++j )
            if ( out[i][j] <= out[i][j-1] )
               return 0;
    
    for ( int i = 1; i <= N * N; ++i )
        if ( !was[i] )
           return 0;
    
    return 1;    
}

int main() {
//    clock_t start, end;
//    start = clock();
    
    freopen("tablete.in", "r", stdin);
    freopen("tablete.out", "w", stdout);
    
    memset( was, 0, sizeof( was ) );
    
    scanf("%d %d", &N, &K);
    for ( int i = 1; i <= N; ++i )
        low[i] = i * K,
        up[i] = ( N - i + 1 ) * ( N - K );
    
    int cur = 1;
    for ( int i = 1; i <= N; ++i ) {
        while ( !(cur%2==0 && cur >= low[i]) )
              ++cur;
        was[cur] = 1;
        out[i][K] = cur; 
    }
    
    cur = 1;
    for ( int i = 1; i <= N; i++ )
        for ( int j = 1; j < K; ++j ) {
            while ( was[cur] )
                  ++cur;
            was[cur] = 1;
            out[i][j] = cur;    
        }
        
    cur = N * N;
    for ( int i = N; i >= 1; i-- )
        for ( int j = N; j > K; j-- ) {
            while ( was[cur] )
                  --cur;
            was[cur] = 1;
            out[i][j] = cur;    
        }
    
    if ( !verify() ) {
        printf("bad\n");   
    }
    
    for ( int i = 1; i <= N; ++i ) {
        printf("%d", out[i][1]);
        for ( int j = 2; j <= N; ++j )
            printf(" %d", out[i][j]);
        printf("\n");    
    }
    
//    end = clock();
    
//    printf("%lf\n", 1.0 * ( end - start ) / CLOCKS_PER_SEC);
    
    return 0;    
}