Pagini recente » Cod sursa (job #1077754) | Cod sursa (job #2788187) | Cod sursa (job #1375611) | Cod sursa (job #890250) | Cod sursa (job #2457748)
#include <stdio.h>
#include <stdlib.h>
FILE *f,*g;
long a[17][17],b[17][17],s,smax;
int N,M,v[17],aux;
int verif() // returneaza 0 daca toate elementele lui v sunt 1 si 1 in caz contrar
{
for(int i = 1; i <= N; i++)
if(v[i] == -1)
return 1;
return 0;
}
int suma(int j) // returneaza suma de pe coloana j
{
int suma = 0;
for(int i=1; i<=N; i++)
suma += b[i][j];
return suma;
}
void flip(int j) // face flip pe coloana j
{
for(int i=1 ; i <= N; i++)
b[i][j] = - b[i][j];
}
int main()
{
int i,j;
f = fopen("flip.in","r");
g = fopen("flip.out","w");
fscanf(f,"%d",&N);
fscanf(f,"%d",&M);
for(i=1; i<=N; i++)
for(j=1; j<=M; j++)
fscanf(f,"%ld",&a[i][j]);
if(N > M) //optimizare...scade nr de operatii
{
for(i = 2; i <= N; i++) // cazul in care N > M construim transpusa
for(j = 1; j <= M && j < i; j++)
{
aux = a[i][j];
a[i][j] = a[j][i];
a[j][i] = aux;
}
aux = N;
N = M;
M = aux;
}
for(int i = 1; i <= N; i++)
v[i] = -1;
v[i] = 0;
while(verif())
{
for(i = 1; i<=N; i++)
if(v[i] == 0)
{
v[i] = -1;
break;
}
else
if(v[i] == 1)
v[i] = -1;
else
{
v[i] = 1;
break;
}
for(i = 1; i <= N; i++) // construim b
for(j = 1; j <= M; j++)
b[i][j] = a[i][j]*v[i];
for(j = 1; j <= M; j++)
if(suma(j) < 0)
flip(j);
s = 0;
for(i = 1; i <= N; i++)
for(j = 1; j <= M; j++)
s += b[i][j];
if(s > smax)
smax = s;
}
fprintf(g,"%ld",smax);
/*for(int i=1; i<=N; i++)
{
s1=0;
s2=0;
for(int j=1; j<=M; j++)
{
s1+=a[i][j];
s2+=(-1)*a[i][j];
}
for(int j=1; j<=M; j++)
if(s1<s2)
a[i][j]=(-1)*a[i][j];
}
for(int j=1; j<=M; j++)
{
s1=0;
s2=0;
for(int i=1; i<=N; i++)
{
s1+=a[i][j];
s2+=(-1)*a[i][j];
}
for(int i=1; i<=N; i++)
if(s1<s2)
a[i][j]=(-1)*a[i][j];
}
for(int i=1; i<=N; i++)
for(int j=1; j<=M; j++)
s+=a[i][j];
fprintf(g,"%d",s);
for(int i=1; i<=N; i++)
{
for(int j=1; j<=M; j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
fclose(f);
fclose(g);
return 0;
}