Pagini recente » Istoria paginii runda/ceau_oni2017_2/clasament | Cod sursa (job #2310847) | Cod sursa (job #1417403) | Cod sursa (job #341177) | Cod sursa (job #860661)
Cod sursa(job #860661)
#include<stdio.h>
int n,m,a[16][16],am[16][16],b[32],snou,svechi=0; //am este matricea modificata
void afisbin() //afiseaza numarul binar (b[n+m]) **test purposes**
{
int i;
for (i = 0; i < n+m; i++)
printf ("%-2i",b[i]);
printf("\n");
}
void bin(int k) //generarea numerelor binare
{
if (k>(n+m)/2-1)
{
changemat(); //schimba matricea
snou = suma(); //genereaza suma noua
if (snou > svechi) svechi = snou;
restoremat();
changemat2();
snou = suma();
if (snou > svechi) svechi = snou;
restoremat();
changemat3();
snou = suma();
if (snou > svechi) svechi = snou;
restoremat();
}
else
{
b[k] = 0; bin(k + 1);
b[k] = 1; bin(k + 1);
}
}
void changemat() //parc intr-un sens
{
int i;
for (i = 0; i < n+m; i++)
{
if (b[i] == 1 && i < n) rind(i);
else if (b[i] == 1 && i >= n) coloana(i-n);
}
}
void changemat2() //parc in celalalt
{
int i;
for (i = 0; i < n+m; i++)
{
if (b[i] == 1 && i < m) coloana(i);
else if (b[i] == 1 && i >= m) rind(i-n);
}
}
void changemat3() //parc de 2 ori
{
int i,k;
k = (n+m)/2;
for (i = 0; i < (n+m)/2; i++)
{
if (b[i] == 1 && i < n) rind(i);
else if (b[i] == 1 && i >= n) coloana(i-n);
}
for (i = 0; i < (n+m)/2; i++)
{
if (b[i] == 1 && i+((n+m)/2) < n) rind(i+((n+m)/2));
else if (b[i] == 1 && i+((n+m)/2) >= n) coloana(i+((n+m)/2)-n);
}
}
void restoremat()
{
int i,j;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
am[i][j]=a[i][j];
}
void cit() //citirea datelor din fisier
{
FILE *f; int i,j;
f=fopen("flip.in","r");
fscanf(f,"%i%i",&n,&m);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
fscanf(f,"%i",&a[i][j]);
am[i][j]=a[i][j]; //initializeaza matricea modifica am[i][j]
}
fclose(f);
}
void afismat() //afisarea matricei a[n][m] **for test purpose only**
{
int i,j;
for (i = 0; i < n; i++ )
{
if (i != 0) printf("\n");
for (j = 0; j < m; j++)
printf ("%-3i",am[i][j]);
}
}
void rind(int k) //inmulteste rindul k cu -1
{
int i;
if (k<n)
for (i = 0; i < m; i++)
am[k][i] = -am[k][i];
else printf("ERROR K PREA MARE RIND");
}
void coloana(int k) //inmulteste coloana k cu -1
{
int i;
if (k<m)
for (i = 0; i < n; i++)
am[i][k] = -am[i][k];
else printf ("ERROR K PREA MARE COLOANA");
}
int suma()
{
int i,j,s=0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
s=s+am[i][j];
return s;
}
void inscrierea(int s) //rezultat => flip.out
{
FILE *f;
f=fopen("flip.out","w");
fprintf(f,"%i",s);
fclose(f);
}
int main()
{
int i,j;
cit();
bin(0);
inscrierea(svechi);
return 0;
}