Cod sursa(job #2660872)

Utilizator matthewvandyekBeatrice Lollio matthewvandyek Data 20 octombrie 2020 19:04:54
Problema Jocul Flip Scor 20
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

void*** Dio=NULL;

struct S
{
	int poz;
	int neg;
};

void readmatrix(int N, int M, int A[N][M], FILE* fp)
{
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)
		{
			fscanf(fp, "%d ", &A[i][j]);
		}
	}
}

void testmatrix(int N, int M, int A[N][M])
{
	printf("\n");
	for(int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)
			printf("%d ", A[i][j]);
		printf("\n");
	}
}

void swap(int N, int M, int A[N][M], int k, int type)
{
	if (type == 0) // then switch line	
		for (int j = 0; j < M; ++j) A[k][j] *= -1;


	if (type == 1) // then switch column
		for (int i = 0; i < N; ++i) A[i][k] *= -1;
}

int sum(int N, int M, int A[N][M])
{
	int sum = 0;
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < M; ++j)
			sum += A[i][j];

	return sum;
}

int main()
{

	FILE* fp;
	fp = fopen("flip.in", "r");

	int N, M;
	fscanf(fp, "%d %d", &N, &M);

	int A[N][M];   
	readmatrix(N, M, A, fp);

	// initialise structure values
	struct S Lin[N], Col[M];
	for (int i = 0; i < N; ++i) Lin[i].poz = Lin[i].neg = 0;
	for (int j = 0; j < M; ++j) Col[j].poz = Col[j].neg = 0;
	
	// flag
	int flag = 1;
	

	// algorithm
	while (flag)
	{
		flag = 0;
		
		for (int i = 0; i < N; ++i)
		{
			for (int j = 0; j < M; ++j)
				if (A[i][j] > 0) Lin[i].poz += A[i][j];
				else if (A[i][j] < 0) Lin[i].neg += (-A[i][j]);
			if (Lin[i].poz < Lin[i].neg) 
			{
				swap(N, M, A, i, 0);
				++flag;
			}
		}
		for (int j = 0; j < M; ++j)
		{
			for (int i = 0; i < N; ++i)
				if (A[i][j] > 0) Col[j].poz += A[i][j];
				else if (A[i][j] < 0) Col[j].neg += (-A[i][j]);
			if (Col[j].poz < Col[j].neg)
			{
				swap(N, M, A, j, 1);
				++flag;
			}
		}	
	}
	fclose(fp);

	fp = fopen("flip.out", "w");
	fprintf(fp, "%d\n", sum(N,M,A));
	fclose(fp);
	
	return 0;
}