Cod sursa(job #1501135)

Utilizator NicholasFlamelFasie Vlad George NicholasFlamel Data 13 octombrie 2015 00:12:33
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>

int n, m;
int **map;

int sumRow(int r)
{
	int result = 0;
	for (int i=0; i<m; ++i)
		result += map[r][i];
	return result;
}

int sumColumn(int c)
{
	int result = 0;
	for (int i=0; i<n; ++i)
		result += map[i][c];
	return result;
}

int checkRow(int r)
{
	return -2 * sumRow(r);
}

int checkColumn(int c)
{
	return -2 * sumColumn(c);
}

void row(int r)
{
	for (int i=0; i<m; ++i)
		map[r][i] *= -1;
}

void column(int c)
{
	for (int i=0; i<n; ++i)
		map[i][c] *= -1;
}

void read()
{
	FILE *f;
	if ( (f = fopen("flip.in", "r")) == NULL )
		exit(0);
	fscanf(f, "%d", &n);
	fscanf(f, "%d", &m);
	map = (int**) malloc(n*sizeof(int*));
	for (int i=0; i<n; ++i)
		map[i] = (int*) malloc(m*sizeof(int));
	for (int i=0; i<n; ++i)
		for (int j=0; j<m; ++j)
			fscanf(f, "%d", ( *(map+i) + j) );
	fclose(f);
}

void write()
{
	FILE *f;
	if ( (f = fopen("flip.out", "w")) == NULL )
		exit(0);
	int s = 0;
	for (int i=0; i<n; ++i)
		for (int j=0; j<m; ++j)
			s += map[i][j];
	fprintf(f, "%d", s);
	for (int i=0; i<n; ++i)
		free(map[i]);
	free(map);
	fclose(f);
}

bool check(int *a, int *b)
{
	for (int i=0; i<n; ++i)
		if (a[i] > 0)
			return false;
	for (int i=0; i<m; ++i)
		if (b[i] > 0)
			return false;
	return true;
}

int getMaxPos(int *v, int n)
{
	int result = 0;
	int compare = v[0];
	for (int i=1; i<n; ++i)
		if (v[i] > compare)
		{
			compare = v[i];
			result = i;
		}
	return result;
}

int main(void)
{
	read();
	int l[n], c[m];
	int ro, col;
	while (true)
	{
		for (int i=0; i<n; ++i)
			l[i] = checkRow(i);
		for (int i=0; i<m; ++i)
			c[i] = checkColumn(i);
		if (check(l, c))
			break;
		ro = getMaxPos(l, n);
		col = getMaxPos(c, m);
		if (l[ro] > c[col])
			row(ro);
		else
			column(col);
	}
	write();
	return 0;
}