Cod sursa(job #1662853)
Utilizator | Data | 25 martie 2016 10:22:20 | |
---|---|---|---|
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;
}