Pagini recente » Profil ionutz_yo | Diferente pentru runda/selectie_emag_mediu_2016_runda3 intre reviziile 2 si 1 | Monitorul de evaluare | Istoria paginii utilizator/anastasia12 | Cod sursa (job #2003053)
/*
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.
*/
#include <iostream>
#include <fstream>
using namespace std;
void printMat(int ** mat,int w,int h){
cout<<endl;
for(int i = 0;i<w;i++){
for(int j = 0;j<h;j++){
cout<<mat[i][j]<<" ";
}
cout<<endl;
}
}
int matSum(int ** mat, int w , int h){
int total=0;
for(int i = 0;i<w;i++){
for(int j = 0;j<h;j++){
total+=mat[i][j];
}
}
return total;
}
int * sum(int **mat,int w,int h){
int *s = new int[w+h]();
for(int i = 0;i<w;i++){
for(int j = 0;j<h;j++){
s[i]+=mat[i][j];
s[w+j]+=mat[i][j];
}
}
return s;
}
void flip(int **mat , int w,int h,int nr){
if(nr>=w){
for(int i = 0 ; i < w;i++)
mat[i][nr-w]*=-1;
}
else{
for(int i = 0 ; i < h;i++)
mat[nr][i]*=-1;
}
}
int getMin(int * arr,int l){
int min = arr[0];
int pos=0;
for(int i = 1 ; i < l; i++){
if(arr[i]<min){
pos=i;
min=arr[i];
}
}
if(min>=0)
return -1;
else
return pos;
}
int main()
{
ifstream input ("flip.in");
ofstream output("flip.out");
int w,h,p;
int **mat;
int * s;
input>>w>>h;
mat=new int* [w];
for(int i = 0 ; i < w ; i++){
mat[i]=new int[h];
for(int j = 0;j<h;j++){
input>>mat[i][j];
}
}
printMat(mat,w,h);
do{
s=sum(mat,w,h);
p = getMin(s,w+h);
if(p>=0){
flip(mat,w,h,p);
printMat(mat,w,h);
}
delete []s;
}while(p>=0);
output<<matSum(mat,w,h);
return 0;
}