Cod sursa(job #428344)

Utilizator KoniacDocea Andrei Koniac Data 29 martie 2010 10:15:48
Problema Teren Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <math.h>
#define Nmax 102

int A[Nmax][Nmax], viz[Nmax][Nmax], C[2][Nmax * Nmax], T[Nmax * Nmax], n, N, t, i, j, x, y, ok;
int dx[] = {0, 0, 1, -1}, dy[] = {-1, 1, 0, 0};

FILE *f = fopen("lacuri.in", "r");
FILE *g = fopen("lacuri.out", "w");

int fill(int i, int j) {
	int k, x, y;
	
	viz[i][j] = 1;
	for (k = 0; k < 4; k++) {
		x = i + dx[k];
		y = j + dy[k];
		if (A[x][y] && !viz[x][y] && x > 0 && x <= n && y > 0 && y <= n) {
			t++;
			fill(x, y);
		}
	}
}

int check(int t, int x, int y) {
	int i, j; double k = sqrt(t);
	
	if ((int) k != k)
		return 0;
	
	for (i = x; i < x + k; i++)
		for (j = y; j < y + k; j++)
			if (A[i][j] != 1)
				return 0;
	
	return 1;
}

void drum(int i) {
	if (T[i]) {
		drum(T[i]);
		fprintf(g, "%d %d\n", C[0][i], C[1][i]);
	}
	else
		fprintf(g, "1 1\n");
}

void lee() {
	int p, u, k;
	
	C[0][1] = 1, C[1][1] = 1, viz[1][1] = 1;
	for (p = u = 1; p <= u; p++) {
		i = C[0][p], j = C[1][p];
		for (k = 0; k < 4; k++) {
			x = i + dx[k];
			y = j + dy[k];
			if (!viz[x][y] && x > 0 && x <= n && y > 0 && y <= n) {
				u++, C[0][u] = x, C[1][u] = y;
				viz[x][y] = 1, T[u] = p;
				if (x == n && y == n) {
					drum(u);
					return;
				}
			}
		}
	}
}

int main() {
	
	fscanf(f, "%d", &n);
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			fscanf(f, "%d", &A[i][j]);
	
	for (i = 1, ok = 1; i <= n; i++)
		for (j = 1; j <= n; j++)
			if (A[i][j] == 1 && !viz[i][j]) {
				t = 1; fill(i, j);
				if (check(t, i, j))
					N++;
				else
					ok = 0;
			}

	fprintf(g, "%d\n", N);
	if (ok)
		lee();
	
	fclose(f); fclose(g);
	
	return 0;
}