Cod sursa(job #3300088)

Utilizator raducumihai2@gmail.comRaducu Mihai [email protected] Data 12 iunie 2025 19:27:55
Problema Jocul Flip Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void fprintf_sum(char* file_name, int final_sum) {
	
	FILE* f = fopen(file_name, "w");
	if (!f) {
		exit(1);
	}

	fprintf(f, "%d", final_sum);
	fclose(f);
}

void get_input(char* file_name, int*** matrix_ptr, int* N, int* M) {
	FILE* f = fopen(file_name, "r");
	if (!f) {
		exit(1);
	}

	fscanf(f, "%d %d", N, M);

	int** matrix = (int**)malloc(*N * sizeof(int*));
	for (int i = 0; i < *N; i++) {
		matrix[i] = (int*)malloc(*M * sizeof(int));
	}

	for (int i = 0; i < *N; i++) {
		for (int j = 0; j < *M; j++) {
			fscanf(f, "%d", &matrix[i][j]);
		}
	}
	fclose(f);

	*matrix_ptr = matrix;
}

int add_line(int **matrix, int line, int M) {

	int s = 0;
	for (int i = 0; i < M; i++) {
		s += (-1) * matrix[line][i];
	}
	return s;
}

int add_column(int **matrix, int column, int N) {
	int s = 0;
	for (int i = 0; i < N; i++) {
		s += (-1) * matrix[i][column];
	}
	return s;
}

int flip(int **matrix, int N, int M, int sw_line, int sw_column) {

	int sum = 0;
	// sw line
	for (int i = 0; i < M; i++) {
		matrix[sw_line][i] *= -1;
	}


// sw col
	for (int i = 0; i < N; i++) {
		matrix[i][sw_column] *= -1;
	}

// add
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			sum += matrix[i][j];
		}
	}
	return sum;
}

void flip_helper(int **matrix, int N, int M, int *sw_line, int *sw_column) {
	int s_line_sum = add_line(matrix, 0, M);
	int s_column_sum = add_column(matrix, 0, N);

	for (int i = 1; i < N; i++) {
		int new_line_sum = add_line(matrix, i, M);
		if (new_line_sum > s_line_sum) {
			s_line_sum = new_line_sum;
			*sw_line = i;
		}
	}

	for (int i = 1; i < M; i++) {
		int new_column_sum = add_column(matrix, i, N);
		if (new_column_sum > s_column_sum) {
			s_column_sum = new_column_sum;
			*sw_column = i;
		}
	}
}

int main() {
	int N, M, sw_line = 0, sw_column = 0, final_sum = 0;
	int** matrix;

	get_input("flip.in", &matrix, &N, &M);
	flip_helper(matrix, N, M, &sw_line, &sw_column);
	final_sum = flip(matrix, N, M, sw_line, sw_column);
	fprintf_sum("flip.out", final_sum);

	// free
	for (int i = 0; i < N; i++)
		free(matrix[i]);
	free(matrix);

	return 0;
}