Cod sursa(job #1025473)

Utilizator ehoratiuEppel Horatiu ehoratiu Data 10 noiembrie 2013 00:38:47
Problema Jocul Flip Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 2.9 kb
/*Gigel a descoperit un nou joc pe care l-a numit "Flip". Acesta se joaca pe o tabla dreptunghiulara de dimensiuni N*M care contine numere intregi. Fiecare linie si fiecare coloana are un comutator care schimba starea tuturor elementelor de pe acea linie sau coloana, inmultindu-le cu -1. Scopul jocului este ca pentru o configuratie data a tablei de joc sa se actioneze asupra liniilor si coloanelor astfel incat sa se obtina o tabla cu suma elementelor cat mai mare.

Cerinta
Dandu-se o configuratie pentru tabla "Flip", realizati un program care sa determine suma maxima pe care Gigel o poate obtine.

Date de Intrare
Prima linie a fisierului flip.in contine doua numere intregi N si M, separate prin cate un spatiu, care reprezinta dimensiunea tablei. Urmatoarele N linii contin cate M numere intregi seperate prin cate un spatiu care descriu configuratia tablei de joc.

Date de Iesire
Prima linie a fisierului flip.out contine un numar care va reprezenta suma maxima pe care Gigel o poate obtine comutand liniile si coloanele tablei de joc.

Restrictii si precizari
1 ≤ N, M ≤ 16
Tabla de joc contine numere intregi din intervalul [-1.000.000,1.000.000]*/

#include <stdio.h>
#include <stdlib.h>


int suma_matrice(int v[100][100], int x, int y)
{
    int i,j,s=0;
    for (i=0 ; i<x ; i++)
        for (j=0 ; j<y ; j++)
            s += v[i][j];
    return s;
}

FILE *fin, *fout;
int main()
{
    int m,n,i,j,suma,temp,contor;
    int a[100][100];
    fin = fopen("flip.in","r");
    fout = fopen("flip.out","w");

    fscanf(fin,"%d %d\n", &m , &n);

//Citire matrice din fisier
    for (i=0 ; i<m ; i++)
    {
        for (j=0 ; j<n ; j++)
        {
            fscanf(fin,"%d ", &a[i][j]);
        }
        fscanf(fin,"\n");
    }


    suma = suma_matrice(a,m,n);

    do
    {
        contor = 0;

//Parcurgere pe linii
        for (i=0 ; i<m ; i++)
        {
            for (j=0 ; j<n ; j++)
            {
                a[i][j] *= (-1);
            }
            temp = suma_matrice(a,m,n);
            if (temp <= suma)
                for (j=0 ; j<n ; j++)
                {
                    a[i][j] *= (-1);
                }
            else
            {
                suma = temp;
                contor = 1;
            }
        }

//Parcurgere pe coloane
        for (j=0 ; j<n ; j++)
        {
            for (i=0 ; i<m ; i++)
            {
                a[i][j] *= (-1);
            }
            temp = suma_matrice(a,m,n);
            if (temp <= suma)
                for (i=0 ; i<m ; i++)
                {
                    a[i][j] *= (-1);
                }
            else
            {
                suma = temp;
                contor = 1;
            }
        }
    }
    while (contor != 0);

    suma = suma_matrice(a,m,n);

    fprintf(fout,"%d",suma);

    fclose(fin);
    fclose(fout);

    return 0;
}