Cod sursa(job #949921)

Utilizator dpopovicDana Popovici dpopovic Data 15 mai 2013 14:44:16
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 5.19 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.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;
	//clock_t begin = clock();
	for(i=0; i<max; i++)
		tab[lin][i] = tab[lin][i] * -1;
//	printf ( "time to invert line = %f\n", ( (double)clock() - begin ) );
}

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, int maxl, int maxc) {
	int i, j;
	for (i=0; i<maxl; i++) {
		for(j=0; j<maxc; j++)
			printf("%4d", tab[i][j]);
		printf("\n");
	}
	printf("\n");
}

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

	fscanf(f1, "%d", N);
	fscanf(f1, "%d", M);
	
	tab = (int**)malloc(*N * sizeof(int*));
	for(i = 0; i < *N; i++) 
		tab[i] = (int*)malloc(*M * sizeof(int));
	
	//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, j, suma=0;
	for(i=0; i<n; i++)
		for(j=0; j<m; j++)
			suma += tab[i][j];
	return suma;
}
*/

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

/*
void copy(int Flip[MAX][MAX], int F[MAX][MAX], int N, int M) {
	int i, j;
	clock_t begin = clock();
	for (i=0; i<N; i++)
		for(j=0; j<M; j++)
			F[i][j] = Flip[i][j];
			
	printf ( "time to copy : %f\n", ( (double)clock() - begin ) );
}
*/

int verify_each(int **Flip, int N, int M, int imin, int jmin, int max) {
	int suma1, suma2;
	int max_tmp;
//	printf("imin=%d   jmin=%d     MAX = %d\n", imin, jmin, max);
//	print_tab(Flip, N, M);
	
	//max_tmp = suma_tot(Flip, N, M);
	int i, j, suma=0;
	for(i=0; i<N; i++)
		for(j=0; j<M; j++)
			suma += Flip[i][j];
	max_tmp = suma;
	if(max > max_tmp)
		max_tmp = max;


	if(imin<N) {
		/*
		suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
		if(suma1>max_tmp)
			max_tmp = suma1;
		//	*/
		//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
		
		for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
		suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
		if(suma1>max_tmp)
			max_tmp = suma1;
			
		for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
		//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
	}
	if(jmin<M) {

		/*
		suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
		if(suma2>max_tmp)
			max_tmp = suma2;
			*/
		//printf("max_tmp j = %d\n", max_tmp);
		for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
		suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
		if(suma2>max_tmp)
			max_tmp = suma2;
		for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];	
		//printf("max_tmp j = %d\n", max_tmp);
	}

	return max_tmp;
}

int backtrack(int **Flip, int N, int M, int imin, int jmin, int max) {
	int suma1, suma2;
	int max_tmp;
//	printf("imin=%d   jmin=%d     MAX = %d\n", imin, jmin, max);
//	print_tab(Flip, N, M);
	
	//max_tmp = suma_tot(Flip, N, M);
	int i, j, suma=0;
	for(i=0; i<N; i++)
		for(j=0; j<M; j++)
			suma += Flip[i][j];
	max_tmp = suma;
	if(max > max_tmp)
		max_tmp = max;

	for (i=N-1; i>imin; i--) {
		for (j=M-1; j>jmin; j--) {
			suma1 = verify_each(Flip, N, M, i, j, max_tmp);
			if(suma1 > max_tmp)
				max_tmp = suma1;
		}
	}
	return max_tmp;
	/*
	if(imin<N) {
		/*
		suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
		if(suma1>max_tmp)
			max_tmp = suma1;
			/
		//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
		
		for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
		suma1 = verify_each(Flip, N, M, imin+1, jmin, max_tmp);
		if(suma1>max_tmp)
			max_tmp = suma1;
			
		for(j=0; j<M; j++) Flip[imin][j] = -Flip[imin][j];
		//printf("max_tmp = %d ---- imin=%d\n", max_tmp, imin);
	}
	if(jmin<M) {

		/*
		suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
		if(suma2>max_tmp)
			max_tmp = suma2;
			/
		//printf("max_tmp j = %d\n", max_tmp);
		for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];
		suma2 = verify_each(Flip, N, M, imin, jmin+1, max_tmp);
		if(suma2>max_tmp)
			max_tmp = suma2;
		for(i=0; i<N; i++) Flip[i][jmin] = -Flip[i][jmin];	
		//printf("max_tmp j = %d\n", max_tmp);
	}

	return max_tmp;
	*/
}


int main() {

	int N, M, suma, change, i, j;
	int **Flip;
	
	clock_t start = clock();
	
	//read_Flip(Flip, &N, &M, "flip.in");
	FILE *f1 = fopen("flip.in", "r");

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

	fclose(f1);	
	
	change = 0;
	for(i=0; i<N; i++)
		for(j=0; j<M; j++)
			change += Flip[i][j];

//	suma = verify_each(Flip, N, M, 0, 0, change);
	suma = backtrack(Flip, N, M, 0, 0, change);
	write_suma(suma, "flip.out");
	
	printf ( "%f\n", ( (double)clock() - start ) / CLOCKS_PER_SEC );
//	printf ( "%f\n", ( (double)clock() - start ) );

	return 0;	
}