Cod sursa(job #2901089)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 12 mai 2022 21:48:21
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.27 kb
//ARISTOTEL NOU

#include <iostream>
#include <vector>
using namespace std;
int sumlin[10],sumdiag1[10],sumdiag2[10],nr,a[10][10],v[50],di1[100],di2[100];
int cat[10]={0,3,4,5,4,3};
pair<int,int> p[100];
bool used[100];
int fortat[100];
//1 linie
//2 diag 1
//3 diag 2

void afis()
{
    for(int i=1;i<=5;i++)
    {
        for(int j=1;j<=cat[i];j++)
            cout<<a[i][j]<<' ';
        cout<<'\n';
    }
}
vector<int> diag1[10],diag2[10];
bool check()
{
    for(int i=1;i<=5;i++)
        if(sumlin[i]!=38||sumdiag1[i]!=38||sumdiag2[i]!=38)
            return 0;
    return 1;
}
int valoare(int k)
{
    int t=v[k];
    int x=p[t].first;
    int y=p[t].second;
    int s=0;
    if(fortat[k]==1)
        return 38-sumlin[x];
    else if(fortat[k]==2)
        return 38-sumdiag1[di1[t]];
    else if(fortat[k]==3)
        return 38-sumdiag2[di2[t]];
}
void bk(int k)
{
    int t=v[k];
    int x=p[t].first;
    int y=p[t].second;
    if(fortat[k])
    {
        a[x][y]=valoare(k);
        if(a[x][y]>0&&a[x][y]<20&&!used[a[x][y]])
        {
            used[a[x][y]]=1;
            sumlin[x]+=a[x][y];
            sumdiag1[di1[t]]+=a[x][y];
            sumdiag2[di2[t]]+=a[x][y];
            if(sumlin[x]<=38&&sumdiag1[di1[t]]<=38&&sumdiag2[di2[t]]<=38)
            {
                if(k<19)
                    bk(k+1);
                else if(check())
                {
                    afis();
                    cout<<'\n';
                }
            }
            used[a[x][y]]=0;
            sumlin[x]-=a[x][y];
            sumdiag1[di1[t]]-=a[x][y];
            sumdiag2[di2[t]]-=a[x][y];
        }
        a[x][y]=0;
        return;
    }
    for(int i=1;i<=19;i++)
        if(!used[i])
        {
            a[x][y]=i;
            sumdiag1[di1[t]]+=a[x][y];
            sumdiag2[di2[t]]+=a[x][y];
            used[i]=1;
            sumlin[x]+=a[x][y];
            if(sumdiag1[di1[t]]<=38&&sumdiag2[di2[t]]<=38&&sumlin[x]<=38)
                bk(k+1);
            used[i]=0;
            sumlin[x]-=a[x][y];
            sumdiag1[di1[t]]-=a[x][y];
            sumdiag2[di2[t]]-=a[x][y];
            a[x][y]=0;
        }
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    for(int i=1;i<=5;i++)
        for(int j=1;j<=cat[i];j++)
            p[++nr]={i,j};
    v[1]=1;v[2]=2;v[3]=3;
    v[4]=7;v[5]=12;v[6]=16;
    v[7]=19;v[8]=18;v[9]=17;
    v[10]=13;v[11]=8;v[12]=4;
    v[13]=5;v[14]=6;
    v[15]=11;
    v[16]=15;
    v[17]=14;
    v[18]=9;
    v[19]=10;
    diag1[1]={1,4,8};
    diag1[2]={2,5,9,13};
    diag1[3]={3,6,10,14,17};
    diag1[4]={7,11,15,18};
    diag1[5]={12,16,19};
    diag2[1]={3,7,12};
    diag2[2]={2,6,11,16};
    diag2[3]={1,5,10,15,19};
    diag2[4]={4,9,14,18};
    diag2[5]={8,13,17};
    fortat[3]=1;
    fortat[5]=3;
    fortat[7]=2;
    fortat[9]=1;
    fortat[11]=3;
    fortat[12]=2;
    fortat[14]=1;
    fortat[15]=3;
    fortat[16]=2;
    fortat[17]=1;
    fortat[18]=3;
    fortat[19]=1;
    for(int i=1;i<=5;i++)
        for(auto it:diag1[i])
            di1[it]=i;
    for(int i=1;i<=5;i++)
        for(auto it:diag2[i])
            di2[it]=i;
    cout<<"Solutiile pentru puzzle-ul lui Aristotel sunt:\n";
    bk(1);
    return 0;
}