Cod sursa(job #3302614)

Utilizator LucianCCraciun Lucian Stefan LucianC Data 9 iulie 2025 14:54:17
Problema Jocul Flip Scor 0
Compilator py Status done
Runda Arhiva de probleme Marime 2.45 kb

class FlipGame:
    def __init__(self, in_file):
        self.in_file = in_file
        self.n = None
        self.m = None
        self.board = None

    def read_board(self):
        with open(self.in_file, 'r') as file:
            n, m = file.readline().strip().split()
            self.n = int(n)
            self.m = int(m)
            if self.n <= 0 or self.m <= 0:
                raise ValueError("Board dimensions must be positive integers.")
        if self.n > 16 or self.m > 16:
            raise ValueError("Board dimensions must not exceed 16x16.")
        board_input = []
        with open(self.in_file, 'r') as file:
            for ix in range(self.n + 1):
                row = list(map(int, file.readline().strip().split()))
                if ix != 0:
                    if len(row) != self.m:
                        raise ValueError(f"Row length {len(row)} does not match specified m {self.m}.")
                    board_input.append(row)
        self.board = board_input

    def col_sum(self, col):
        return sum(row[col] for row in self.board)

    def row_sum(self, row):
        return sum(self.board[row])

    def min_sum(self):
        ss = 0
        tt = (-1, -1)
        for i in range(self.n):
            if self.row_sum(i) < ss:
                ss = self.row_sum(i)
                tt = (i, 0)
        for j in range(self.m):
            if self.col_sum(j) < ss:
                ss = self.col_sum(j)
                tt = (0, j)
        # print(f"Minimum sum is {ss} at {tt}")
        return tt

    def solve_flip(self):
        tt = self.min_sum()
        while tt != (-1, -1):
            if tt[0] == 0:
                # print(f"Flipping column {tt[1]}")
                for i in range(self.n):
                    self.board[i][tt[1]] = -self.board[i][tt[1]]
            else:
                # print(f"Flipping row {tt[0]}")
                for j in range(self.m):
                    self.board[tt[0]][j] = -self.board[tt[0]][j]
            # self.print_board()
            tt = self.min_sum()

    def print_board(self):
        for row in self.board:
            print(row)


flip = FlipGame("./flip.in")
flip.read_board()
# print("Initialized FlipGame board:")
# flip.print_board()
# print("Starting to solve the FlipGame...")
flip.solve_flip()
# print("Final FlipGame board:")
# flip.print_board()
# print(f"Total Sum: {sum(sum(row) for row in flip.board)}")
with open("./flip.out", 'w') as file:
    file.write(f"{sum(sum(row) for row in flip.board)}\n")