Pagini recente » Cod sursa (job #275824) | Cod sursa (job #2675151) | Cod sursa (job #2701397) | Cod sursa (job #2268083) | Cod sursa (job #2901089)
//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;
}