Cod sursa(job #2544275)

Utilizator LianiuIulian Panaitescu Lianiu Data 11 februarie 2020 21:29:19
Problema Jocul Flip Scor 30
Compilator c-64 Status done
Runda Arhiva de probleme Marime 3.03 kb
#include <stdio.h>
#include <stdlib.h>

int suma_maxima(int **tabla,int N,int M){

	int i,j,*suma_poz_col,*suma_neg_col,*suma_poz_linii,*suma_neg_linii,suma_max=0;

	suma_poz_linii=calloc(N,sizeof(int));
	if(!suma_poz_linii)
		return 0;
	suma_neg_linii=calloc(N,sizeof(int));
	if(!suma_neg_linii)
		return 0;
	suma_poz_col=calloc(M,sizeof(int));
	if(!suma_poz_col)
		return 0;
	suma_neg_col=calloc(M,sizeof(int));
	if(!suma_neg_col)
		return 0;

	if(N>=M){

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(tabla[i][j]<=0){
					suma_neg_linii[i]+=tabla[i][j];
				}
				else{
					suma_poz_linii[i]+=tabla[i][j];
				}
			}
		}

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(((-1)*suma_neg_linii[i])>suma_poz_linii[i]){
					tabla[i][j]=(-1)*tabla[i][j];
				}
			}
		}

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(tabla[i][j]<=0){
					suma_neg_col[j]+=tabla[i][j];
				}
				else{
					suma_poz_col[j]+=tabla[i][j];
				}
			}
		}
	
		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(((-1)*suma_neg_col[j])>suma_poz_col[j]){
					tabla[i][j]=(-1)*tabla[i][j];
				}
			}
		}
	}

	if(N<M){

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(tabla[i][j]<=0){
					suma_neg_col[j]+=tabla[i][j];
				}
				else{
					suma_poz_col[j]+=tabla[i][j];
				}
			}
		}

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(((-1)*suma_neg_col[j])>suma_poz_col[j]){
					tabla[i][j]=(-1)*tabla[i][j];
				}
			}
		}

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(tabla[i][j]<=0){
					suma_neg_linii[i]+=tabla[i][j];
				}
				else{
					suma_poz_linii[i]+=tabla[i][j];
				}
			}
		}

		for(i=0;i<N;i++){
			for(j=0;j<M;j++){
				if(((-1)*suma_neg_linii[i])>suma_poz_linii[i]){
					tabla[i][j]=(-1)*tabla[i][j];
				}
			}
		}
	}

	for(i=0;i<N;i++){
		for(j=0;j<M;j++){	
			suma_max+=tabla[i][j];
		}
	}
	free(suma_poz_linii);
	free(suma_neg_linii);
	free(suma_poz_col);
	free(suma_neg_col);

	return suma_max;
}

int main(){

	FILE *input=fopen("flip.in","rt");
	if(!input)
		return 0;

	int N,M,i,**tabla,j;

	fscanf(input,"%i %i",&N,&M);

	tabla=malloc(N*sizeof(int*));
	if(!tabla)
		return 0;

	for(i=0;i<N;i++){
		tabla[i]=malloc(M*sizeof(int));
		if(!tabla[i])
			return 0;
	}

	for(i=0;i<N;i++){
		for(j=0;j<M;j++){
			fscanf(input,"%i",&tabla[i][j]);
		}
	}

	fclose(input);

	FILE *output=fopen("flip.out","wt");
	if(!output)
		return 0;

	if(N==1){
		if(M==1){
			if(tabla[0][0]<0){
				fprintf(output,"%i\n",(-1)*tabla[0][0]);
			}
			else{
				fprintf(output,"%i\n",tabla[0][0]);
			}
		}
		else{
			int suma_pe_linie=0;
			for(i=0;i<M;i++){
				if(tabla[0][i]>=0){
					suma_pe_linie+=tabla[0][i];
				}
				else{
					suma_pe_linie+=(-1)*tabla[0][i];
				}
			}
			fprintf(output,"%i\n",suma_pe_linie);
		}
	}
	else{
		if(M==1){
			int suma_pe_coloana=0;
			for(i=0;i<N;i++){
				if(tabla[i][0]>=0){
					suma_pe_coloana+=tabla[i][0];
				}
				else{
					suma_pe_coloana+=(-1)*tabla[i][0];
				}
			}
			fprintf(output,"%i\n",suma_pe_coloana);
		}
		else{
			fprintf(output,"%i\n",suma_maxima(tabla,N,M));
		}
	}

	fclose(output);

	for(i=0;i<N;i++){
		free(tabla[i]);
	}
	free(tabla);

	return 0;
}