Cod sursa(job #949627)

Utilizator dpopovicDana Popovici dpopovic Data 14 mai 2013 14:39:14
Problema Jocul Flip Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>

#define MAX 16

int suma_l(int tab[MAX][MAX], int max, int lin) {
	int i, suma = 0;
	for(i=0; i<max; i++) 
		suma += tab[lin][i];
	return suma;
}

int suma_c(int tab[MAX][MAX], int max, int col) {
	int i, suma = 0;
	for(i=0; i<max; i++) 
		suma += tab[i][col];
	return suma;
}

void invert_l(int tab[MAX][MAX], int max, int lin) {
	int i;
	for(i=0; i<max; i++)
		tab[lin][i] = tab[lin][i] * -1;
}

void invert_c(int tab[MAX][MAX], int max, int col) {
	int i;
	for(i=0; i<max; i++)
		tab[i][col] = tab[i][col] * -1;
}

void print_tab(int tab[MAX][MAX], int maxl, int maxc) {
	int i, j;
	for (i=0; i<maxl; i++) {
		for(j=0; j<maxc; j++)
			printf("%3d", tab[i][j]);
		printf("\n");
	}
	printf("\n");
}

void read_Flip(int tab[MAX][MAX], int *N, int *M, char *filename) {
	int i,j;
	FILE *f1 = fopen(filename, "r");

	fscanf(f1, "%d", N);
	fscanf(f1, "%d", M);
	
	printf("N=%d; M=%d\n", *N, *M);
	
	for(i=0; i<*N; i++)
		for(j=0; j<*M; j++)
			fscanf(f1, "%d", &tab[i][j]);
			
	print_tab(tab, *N, *M);

	fclose(f1);	
}

int suma_tot(int tab[MAX][MAX], int n, int m) {
	int i, suma=0;
	for(i=0; i<n; i++)
		suma += suma_l(tab, m, i);
	return suma;
}

void write_suma(int suma, char *filename) {
	FILE *f2 = fopen(filename, "w");
	fprintf(f2, "%d\n", suma);
	fclose(f2);
}

int check_lines(int Flip[MAX][MAX], int N, int M) {
	int change = 0, i, j, suma;
	for(i=0; i<N; i++) {
		suma = suma_l(Flip, M, i);
		if(suma<0) {
			invert_l(Flip, M, i);
			change++;
		}
	}
	return change;
}

int check_cols(int Flip[MAX][MAX], int N, int M) {
	int change = 0, i, j, suma;
	for(j=0; j<M; j++) {
		suma = suma_c(Flip, N, j);
		if(suma<0) {
			invert_c(Flip, N, j);
			change++;
		}
	}
	return change;	
}

int main() {

	int N, M, suma, i, j, change;
	int Flip[MAX][MAX];
	
	read_Flip(Flip, &N, &M, "flip.in");
	
	
	do {
		change = check_lines(Flip, N, M);
		change += check_cols(Flip, N, M);
		print_tab(Flip, N, M);
	} while(change > 0);
	
	suma = suma_tot(Flip, N, M);

	write_suma(suma, "flip.out");

	return 0;	
}