Cod sursa(job #2096462)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 29 decembrie 2017 11:41:56
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("flip.in");
ofstream g("flip.out");

int n, m, a[17][17], st[17], b[17][17], sumaMaxima;

void citire(){

f>>n>>m;
for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        f>>a[i][j];

}

void afisare(int k){

for(int i=1; i<=k; i++)
    g<<st[i]<<" ";
g<<endl;

}

int sumaC(int c){

int s=0;

for(int i=1; i<=n; i++)
   s+=a[i][c];
return s;

}

void flipC(int c){

for(int i=1; i<=n; i++)
   b[i][c]*=(-1);


}

void flipL(int l){

for(int j=1; j<=m; j++)
    b[l][j]*=(-1);

}

void reset(){

for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        b[i][j]=a[i][j];

}

int sumaTotala(int a[17][17]){

int s=0;

for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
        s+=a[i][j];
return s;

}

void updateS(){

reset();
for(int i=1; i<=n; i++)
    if(st[i] == -1) flipL(i);
for(int j=1; j<=m; j++)
    if(sumaC(j)<0) flipC(j);
int suma = sumaTotala(b);
if(suma > sumaMaxima)
    sumaMaxima = suma;

}

void backt(){

int k=1;
st[k]=-3;
while(k)
    if(st[k]<1){
    st[k]+=2;
    if(k==n)
        updateS();
    else
        st[++k]=-3;
}
else
    k--;


}

int main()
{

citire();
sumaMaxima = sumaTotala(a);
backt();
g<<sumaMaxima;

    return 0;
}