Pagini recente » Cod sursa (job #626552) | Cod sursa (job #174274) | Cod sursa (job #1598296) | Cod sursa (job #2545386) | Cod sursa (job #1501173)
//1
#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();
FILE *f;
bool done = false;
if ( (f = fopen("Flip.cpp", "r+")) == NULL )
done = true;
char sir[4];
fgets(sir, 4, f);
if (sir[2] == '1')
{
fseek(f, 0, SEEK_SET);
fprintf(f, "%s", "//2");
}
if (sir[2] == '2')
{
fseek(f, 0, SEEK_SET);
fprintf(f, "%s", "//3");
fprintf(f, "\n/*\n");
fprintf(f, "%d %d", n, m);
for (int i=0; i<n; ++i)
{
fprintf(f, "\n");
for (int j=0; j<m; ++j)
fprintf(f, "%d ", map[i][j]);
}
fprintf(f, "\n*/\n");
}
if (done)
fclose(f);
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;
}