Pagini recente » Cod sursa (job #813404) | Cod sursa (job #1393144) | Cod sursa (job #960582) | Istoria paginii runda/kys | Cod sursa (job #1501120)
#include <stdio.h>
#include <stdlib.h>
int n, m;
int **map;
int sumRow(int r)
{
int result = 0;
for (int i=0; i<m; ++i)
result += map[r][i];
return result;
}
int sumColumn(int c)
{
int result = 0;
for (int i=0; i<n; ++i)
result += map[i][c];
return result;
}
int checkRow(int r)
{
return -2 * sumRow(r);
}
int checkColumn(int c)
{
return -2 * sumColumn(c);
}
void row(int r)
{
for (int i=0; i<m; ++i)
map[r][i] *= -1;
}
void column(int c)
{
for (int i=0; i<n; ++i)
map[i][c] *= -1;
}
void read()
{
FILE *f;
if ( (f = fopen("flip.in", "r")) == NULL )
exit(0);
fscanf(f, "%d", &n);
fscanf(f, "%d", &m);
map = (int**) malloc(n*sizeof(int*));
for (int i=0; i<n; ++i)
map[i] = (int*) malloc(m*sizeof(int));
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j)
fscanf(f, "%d", ( *(map+i) + j) );
fclose(f);
}
void write()
{
FILE *f;
if ( (f = fopen("flip.out", "w")) == NULL )
exit(0);
int s = 0;
for (int i=0; i<n; ++i)
for (int j=0; j<m; ++j)
s += map[i][j];
fprintf(f, "%d", s);
for (int i=0; i<n; ++i)
free(map[i]);
free(map);
fclose(f);
}
bool check(int *a, int *b)
{
for (int i=0; i<n; ++i)
if (a[i] > 0)
return false;
for (int i=0; i<m; ++i)
if (b[i] > 0)
return false;
return true;
}
int getMaxPos(int *v, int n)
{
int result = 0;
int compare = v[0];
for (int i=1; i<n; ++i)
if (v[i] > compare)
{
compare = v[i];
result = i;
}
return result;
}
int main(void)
{
read();
int l[n], c[m];
int ro, col;
while (true)
{
for (int i=0; i<n; ++i)
l[i] = checkRow(i);
for (int i=0; i<m; ++i)
c[i] = checkColumn(i);
if (check(l, c))
break;
ro = getMaxPos(l, n);
col = getMaxPos(c, m);
if (l[ro] > c[col])
row(ro);
else
column(col);
}
write();
return 0;
}