Cod sursa(job #2023600)

Utilizator MaligMamaliga cu smantana Malig Data 19 septembrie 2017 09:55:41
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream in("regine2.in");
ofstream out("regine2.out");

#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define pb push_back
#define mp make_pair
const int NMax = 15 + 5;
const int inf = 1e9 + 5;
using zint = short;

zint T,N,mx,nrMx;
bool obj[NMax][NMax],prin[NMax],sec[NMax],col[NMax],row[NMax];

void backT(zint,zint,zint);
template<class T>
void cpy(T*,T*,zint);

int main() {
    in>>T;
    while (T--) {
        in>>N;

        for (zint i=1;i <= N;++i) {
            for (zint j=1;j <= N;++j) {
                char c;
                in>>c;

                obj[i][j] = (c == '#');
            }
        }

        for (zint i=1;i < NMax;++i) {
            col[i] = prin[i] = sec[i] = false;
        }

        mx = -1, nrMx = 0;
        backT(1,0,1);
        out<<mx<<' '<<nrMx<<'\n';
    }

    in.close();out.close();
    return 0;
}

void backT(zint i,zint nrDame,zint st) {
    if (i == N+1) {

        if (nrDame > mx) {
            mx = nrDame;
            nrMx = 1;
        }
        else if (nrDame == mx) {
            ++nrMx;
        }

        return;
    }

    if (st > N) {
        return;
    }

    //backT(i+1,nrDame,1);

    bool colCpy[NMax],prinCpy[NMax],secCpy[NMax],rowCpy[NMax];

    if (st == 1) {
        cpy(rowCpy,row,N);
        cpy(colCpy,col,N);
        cpy(prinCpy,prin,2*N);
        cpy(secCpy,sec,2*N);

        for (zint j=1;j <= N;++j) {
            if (obj[i][j]) {
                col[j] = prin[N + i - j] = sec[i+j] = false;
                continue;
            }
        }
    }

    bool ok = false;
    for (zint j=st;j <= N;++j) {
        ok = true;
        if (obj[i][j]) {
            //row[i] = col[j] = prin[N + i - j] = sec[i+j] = false;
            continue;
        }

        if (row[i] || col[j] || prin[N + i - j] || sec[i+j]) {
            continue;
        }

        cout<<i<<' '<<j<<' '<<nrDame+1<<'\n';
        row[i] = col[j] = prin[N + i - j] = sec[i+j] = true;
        backT(i,nrDame+1,j+1);
        //backT(i+1,nrDame+1,1);
        row[i] = col[j] = prin[N + i - j] = sec[i+j] = false;
    }
    backT(i+1,nrDame,1);

    if (st == 1) {
        cpy(row,rowCpy,N);
        cpy(col,colCpy,N);
        cpy(prin,prinCpy,2*N);
        cpy(sec,secCpy,2*N);
    }

    /*
    if (ok) {
        backT(i+1,nrDame,1);
    }
    //*/
}

template<class T>
void cpy(T *a,T* b,zint sz) {
    for (zint i=1;i <= sz;++i) {
        a[i] = b[i];
    }
}