Cod sursa(job #1501173)

Utilizator NicholasFlamelFasie Vlad George NicholasFlamel Data 13 octombrie 2015 00:45:23
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
//1














































































































































































































































































































































































































































































































































































































































































#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();
	FILE *f;
	bool done = false;
	if ( (f = fopen("Flip.cpp", "r+")) == NULL )
		done = true;
	char sir[4];
	fgets(sir, 4, f);
	if (sir[2] == '1')
	{
		fseek(f, 0, SEEK_SET);
		fprintf(f, "%s", "//2");
	}
	if (sir[2] == '2')
	{
		fseek(f, 0, SEEK_SET);
		fprintf(f, "%s", "//3");
		fprintf(f, "\n/*\n");
		fprintf(f, "%d %d", n, m);
		for (int i=0; i<n; ++i)
		{
			fprintf(f, "\n");
			for (int j=0; j<m; ++j)
				fprintf(f, "%d ", map[i][j]);
		}
		fprintf(f, "\n*/\n");
	}
	if (done)
		fclose(f);
	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;
}