Pagini recente » Cod sursa (job #740572) | Cod sursa (job #1594610) | Cod sursa (job #775022) | Cod sursa (job #845608) | Cod sursa (job #1329903)
/*
Enunt:
Jocul Flip
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]
Exemplu
flip.in
5 3
4 -2 2
3 -1 5
2 0 -3
4 1 -3
5 -3 2
flip.out
28
*/
/*
Rezolvare:
Luam toate configuratiile de subumltumi pe coloane si facem flip pe liniile cu suma negativa.
*/
#include <stdio.h>
FILE *in, *out;
int m, n, x[20][20], smax;
int main ()
{
int i, j, l, b[20], s, sl, aux, p;
in = fopen("flip.in", "r");
out = fopen("flip.out", "w");
fscanf(in, "%d", &m);
fscanf(in, "%d", &n);
for (i=1; i<=m; i++)
{
for (j=1; j<=n; j++)
{
fscanf(in, "%d", &x[i][j]);
}
}
// calculam 2^n
p = 1;
for (i=1; i<=n; i++)
{
p = p * 2;
}
for (l=0; l<p; l++)
{
aux = l;
// aflam submultimea transoformand l in baza 2
for (j=1; j<=n; j++)
{
b[j] = aux % 2;
aux = aux / 2;
}
s = 0;
for (i=1; i<=m; i++)
{
sl = 0;
for (j=1; j<=n; j++)
{
if (b[j])
sl = sl - x[i][j];
else
sl = sl + x[i][j];
}
if (sl < 0)
sl = -sl;
s = s + sl;
}
if (s > smax)
smax = s;
}
fprintf(out, "%d\n", smax);
fclose(out);
fclose(in);
return 0;
}