Cod sursa(job #19942)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 20 februarie 2007 12:22:13
Problema Zone Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

const int S_MAX = 16;
const int N_MAX = 550;

int a[N_MAX][N_MAX];
int s[S_MAX], nr = 0;

struct sum {
	int sm, unu, doi, trei;
} par[S_MAX * S_MAX * S_MAX];

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

	int N, i, j, k;
	scanf("%d\n", &N);
	for (i = 1; i <= 9; i ++) {
		scanf("%d ", &s[i]);
	}
	for (i = 1; i <= N; i ++) {
		for (j = 1; j <= N; j ++) {
			scanf("%d ", &a[i][j]);
		}
	}

	for (i = 1; i <= 7; i ++) {
		for (j = i + 1; j <= 8; j ++) {
			for (k = j + 1; k <= 9; k ++) {
				par[++ nr].sm = s[i] + s[j] + s[k];
				par[nr].unu = s[i];
				par[nr].doi = s[j];
				par[nr].trei = s[k];
			}
		}
	}

	int poz = 0, suma = 0, l1 = 0, l2 = 0, c1 = 0, c2 = 0;
	for (i = 1; i <= N && !poz; i ++) {
		for (j = 1; j <= N; j ++) {
			suma += a[i][j];
		}
		for (k = 1; k <= nr; k ++) {
			if (par[k].sm == suma) {
				par[k].sm = -1;
				poz = k;
				l1 = i;
				break;
			}
		}
	}

	suma = 0;
	for (i = 1; i <= N; i ++) {
		for (j = 1; j <= l1; j ++) {
			suma += a[j][i];
		}
		if (par[poz].unu == suma || par[poz].doi == suma || par[poz].trei == suma) {
			if (par[poz].unu == suma) {
				par[poz].unu = 0;
			}
			if (par[poz].doi == suma) {
				par[poz].doi = 0;
			}
			if (par[poz].trei == suma) {
				par[poz].trei = 0;
			}
			c1 = i;
			break;
		}
	}
	
	suma = 0;
	for (i = l1 + 1; i <= N; i ++) {
		for (j = 1; j <= N; j ++) {
			suma += a[i][j];
		}
		for (k = 1; k <= nr; k ++) {
			if (suma == par[k].sm) {
				l2 = i;
			}
		}
	}

	suma = 0;
	for (i = c1 + 1; i <= N; i ++) {
		for (j = 1; j <= l1; j ++) {
			suma += a[j][i];
		}
		if (par[poz].unu == suma || par[poz].doi == suma || par[poz].trei == suma) {
			c2 = i;
			break;
		}
	}

	printf("%d %d %d %d\n", l1, l2, c1, c2);
	
	return 0;
}