Cod sursa(job #249509)

Utilizator coderninuHasna Robert coderninu Data 28 ianuarie 2009 17:19:17
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#define Nmax 101

inline int inf(float x) { if ((int)x == x) return (int)x; return (int)x; }

float v[Nmax][Nmax], L[Nmax], C[Nmax];
int i, j, k, N, M, l[Nmax], c[Nmax], uz[Nmax][Nmax], loc, max, dist;

int main()
{
	for (freopen("matrice2.in", "r", stdin), freopen("matrice2.out", "w", stdout), scanf("%d %d\n", &N, &M), i = 1; i<=N; ++i)
		for (j = 1; j<=M; ++j)
		{
			scanf("%f ", &v[i][j]);
			L[i] += v[i][j];
			C[j] += v[i][j];
		}
		
	for (i = 1; i<=N; ++i)
		for (j = 1; j<=M; ++j)
		{
			if ( (int)v[i][j] == v[i][j] ) ++uz[i][j];
			l[i] += inf(v[i][j]);
			c[j] += inf(v[i][j]);
		}
	for (j = 1; j<=M; ++j)
	{
		for (dist = inf(C[j]) - c[j]; dist; --dist)
		{
			loc = 0; max = -1;
			for (i = 1; i<=N; ++i)
				if (!uz[i][j] && inf(L[i]) - l[i] > max)
				{
					if (inf(L[i]) - l[i] == 0 && (int)L[i] == L[i]) continue;
					max = inf(L[i]) - l[i];
					loc = i;
				}
			++uz[loc][j];
			++l[loc];
			++c[j];
		}
	}
	
	for (i = 1; i<=N; ++i)
		if (inf(L[i]) > l[i])
		{
			dist = inf(L[i]) - l[i];
			for (j = 1; j<=M; ++j)
				if (inf(C[j]) == c[j] && !uz[i][j] && (int)C[j] != C[j])
				{
					++uz[i][j];
					++c[j];
					if (!(--dist)) break;
				}
		}
	
	for (i = 1; i<=N; ++i)
	{
		for (j = 1; j<=M; ++j)
		{
			if ( (int)v[i][j] == v[i][j] ) --uz[i][j];
			printf("%d ", inf(v[i][j]) + uz[i][j]);
		}
		printf("\n");
	}
		
	return 0;
}