Cod sursa(job #2544072)

Utilizator LianiuIulian Panaitescu Lianiu Data 11 februarie 2020 19:08:28
Problema Jocul Flip Scor 10
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.38 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;

	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];
			}
		}
	}

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