Cod sursa(job #1458503)

Utilizator valentin50517Vozian Valentin valentin50517 Data 7 iulie 2015 17:41:32
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <iostream>
#define LIN 0
#define COL 1
using namespace std;
ifstream fin("flip.in");
ofstream fout("flip.out");
struct nod{
	bool tip;
	int key;	
};
int N,M, A[20][20], L[20], C[20],cod,rs;
nod coada[100000];
void inv_lin(int i){
	if(L[i] < 0)
	for(int j = 1;j<=M;j++){
		A[i][j] *= -1;
		C[j] += A[i][j]*2;
		L[i] += A[i][j]*2;
		if(C[j] < 0)
			coada[++cod].key = j,
			coada[cod].tip = COL;
	}
}

void inv_col(int i){
	if(C[i] < 0)
	for(int j = 1;j<=N;j++){
		A[j][i] *=-1;
		L[j] += A[j][i]*2;
		C[i] += A[j][i]*2;
		if(L[j] < 0)
			coada[++cod].key = j,
			coada[cod].tip = LIN;
	}
}

void solve(){
	int i = 1,j,k;
	while(i <= cod){
		if(coada[i].tip == LIN){
			inv_lin(coada[i].key);
		}else{
			inv_col(coada[i].key);
		}
		i++;
	}
}

int main(){
	int i,j;
	fin >> N >> M;
	for(i = 1;i<=N;i++)
		for(j = 1;j<=M;j++){
			fin >> A[i][j];
			L[i] += A[i][j];
			C[j] += A[i][j];
		}
	
	for(i = 1;i<= N;i++) 
		if(L[i] < 0)
			coada[++cod].key = i,
			coada[cod].tip = LIN;
							
	for(i = 1;i<= M;i++)
		if(C[i] < 0)
			coada[++cod].key = i,
			coada[cod].tip = COL;
	solve();
	for(i = 1;i<= N;i++) rs+= L[i];
	fout << rs;	
	return 0;
}