Cod sursa(job #1606753)

Utilizator cristina_borzaCristina Borza cristina_borza Data 20 februarie 2016 15:01:37
Problema Zone Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.44 kb
#include <fstream>
#include <cstdio>

#define INF 10000000000

using namespace std;

long long n , x , sl1 = INF , sl2 = INF , sc1 = INF , sc2 = INF;
long long mat[600][600] , v[15] , viz[15];

void read(long long &x) {
    long long sign = 1;
    char ch;
    x = 0;

    while(!isdigit(ch = getchar())) {
        if(ch == '-') {
            sign = -1;
        }

        else {
            sign = 1;
        }
    }

    do {
        x = x * 10 + ch - '0';
    }while(isdigit(ch = getchar()));

    x *= sign;
}

bool verif(long long x) {
    for(int i = 1 ; i <= 9 ; ++i) {
        if(v[i] == x && viz[i] == 0) {
            viz[i] = 1;
            return 1;
        }
    }

    return 0;
}

void rep(long long x) {
    for(int i = 1 ; i <= 9 ; ++i) {
        if(v[i] == x && viz[i] == 1) {
            viz[i] = 0;
            return;
        }
    }
}

int main() {
    freopen("zone.in" , "r" , stdin);
    freopen("zone.out" , "w" , stdout);

    read(n);

    for(int i = 1 ; i <= 9 ; ++i) {
        read(v[i]);
    }

    for(int i = 1 ; i <= n ; ++i) {
        for(int j = 1 ; j <= n ; ++j) {
            read(x);
            mat[i][j] = x + mat[i - 1][j] + mat[i][j - 1] - mat[i - 1][j - 1];
        }
    }

    for(int lin1 = 1 ; lin1 < n - 1 ; ++lin1) {
        for(int col1 = 1 ; col1 < n - 1 ; ++col1) {
            int ok = verif(mat[lin1][col1]);
            if(ok) {
                for(int lin2 = lin1 + 1 ; lin2 < n ; ++lin2) {
                    ok = verif(mat[lin2][col1] - mat[lin1][col1]);
                    if(ok) {
                        ok = verif(mat[n][col1] - mat[lin2][col1]);
                        if(ok) {

                            for(int col2 = col1 + 1 ; col2 < n ; ++col2) {
                                ok = verif(mat[lin1][col2] - mat[lin1][col1]);
                                if(ok) {

                                    ok = verif(mat[lin1][n] - mat[lin1][col2]);
                                    if(ok) {

                                        ok = verif(mat[lin2][col2] - mat[lin2][col1] - mat[lin1][col2] + mat[lin1][col1]);
                                        if(ok) {

                                            ok = verif(mat[lin2][n] - mat[lin2][col2] - mat[lin1][n] + mat[lin1][col2]);
                                            if(ok) {

                                                ok = verif(mat[n][col2] - mat[n][col1] - mat[lin2][col2] + mat[lin2][col1]);
                                                if(ok) {

                                                    ok = verif(mat[n][n] - mat[n][col2] - mat[lin2][n] + mat[lin2][col2]);
                                                    if(ok) {
                                                        if(lin1 < sl1) {
                                                            sl1 = lin1 , sl2 = lin2 , sc1 = col1 , sc2 = col2;
                                                        }

                                                        else {
                                                            if(lin1 == sl1 && col1 < sc1) {
                                                                sl1 = lin1 , sl2 = lin2 , sc1 = col1 , sc2 = col2;
                                                            }

                                                            else {
                                                                if(lin1 == sl1 && col1 == sc1 && lin2 < sl2) {
                                                                    sl1 = lin1 , sl2 = lin2 , sc1 = col1 , sc2 = col2;
                                                                }

                                                                else {
                                                                    if(lin1 == sl1 && col1 == sc1 && lin2 == sl2 && col2 < sc2) {
                                                                        sl1 = lin1 , sl2 = lin2 , sc1 = col1 , sc2 = col2;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                    rep(mat[n][n] - mat[n][col2] - mat[lin2][n] + mat[lin2][col2]);
                                                }
                                                rep(mat[n][col2] - mat[n][col1] - mat[lin2][col2] + mat[lin2][col1]);
                                            }
                                            rep(mat[lin2][n] - mat[lin2][col2] - mat[lin1][n] + mat[lin1][col2]);
                                        }
                                        rep(mat[lin2][n] - mat[lin2][col2] - mat[lin1][n] + mat[lin1][col2]);
                                    }
                                    rep(mat[lin1][n] - mat[lin1][col2]);
                                }
                                rep(mat[lin1][col2] - mat[lin1][col1]);
                            }
                        }
                        rep(mat[n][col1] - mat[lin2][col1]);
                    }
                    rep(mat[lin2][col1] - mat[lin1][col1]);
                }
            }
            rep(mat[lin1][col1]);
        }
    }

    printf("%lld %lld %lld %lld" , sl1 , sl2 , sc1 , sc2);
    return 0;
}