Cod sursa(job #2334746)

Utilizator primeBasso Nicolae prime Data 2 februarie 2019 23:17:39
Problema Jocul Flip Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
 
 
int N, M, sumMax, currentSum;
int table[16][16];
 
 
unsigned int power(unsigned int base, unsigned int exp)
{
    register unsigned int result = 1;
    for (;;)
    {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        if (!exp)
            break;
        base *= base;
    }
 
    return result;
}
 
 
int computeSum(unsigned int rowsFlip, unsigned int colsFlip)
{
    register int i, j, tableSum = 0, sum, minusOn;
    char sign[16];
    for (j = 0; j < M; j++)
    {
        if ((colsFlip >> j) & 0x0001)
        {
            sign[j] = -1;
        }
        else
        {
            sign[j] = 1;
        }
    }
    //printf("rowsflip=%x, colsFlip=%x\n", rowsFlip, colsFlip);
    for (i = 0; i < N; i++)
    {
        sum = 0;
        for (j = 0; j < M; j++)
        {
            //minusOn = (colsFlip >> j) & 0x01;//(((rowsFlip >> i) & 0x01); + ((colsFlip >> j) & 0x01)) % 2;
 
            sum += table[i][j] * sign[j];
 
 
        }
        tableSum += abs(sum);
    }
    return tableSum;
}
 
void printMatrix(void)
{
    int i, j;
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("%d ", table[i][j]);
        }
        printf("\n");
    }
    printf("printing finished\n");
}
 
void readInput(void)
{
    register int i, j;
    FILE * fp;
    fp = fopen("flip.in", "r");
    if (!fscanf(fp, "%d", &N))
    {
        fclose(fp);
        return;
    }
    if (!fscanf(fp, "%d", &M))
    {
        fclose(fp);
        return;
    }
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            if (!fscanf(fp, "%d", &table[i][j]))
            {
                fclose(fp);
                return;
            }
        }
    }
    fclose(fp);
}
 
void iterateThroughSolutions(void)
{
    register unsigned int i, j;
    i = 0;
    //for (i = 0; i < power(2, N-1); i++)
    {
        for (j = 0; j < power(2, M); j++)
        {
            currentSum = computeSum(i,j);
            (currentSum > sumMax ? sumMax = currentSum: 1);
            /*if (currentSum > sumMax)
            {
                sumMax = currentSum;
            }*/
        }
    }
}
 
void printOutput(void)
{
    FILE * fp;
    fp = fopen("flip.out", "w");
    fprintf(fp, "%d", sumMax);
    fclose(fp);
}
 
int main(void)
{
    sumMax = INT_MIN;
    currentSum = INT_MIN;
    readInput();
 
    iterateThroughSolutions();
 
    printOutput();
 
    return 0;
}