Orar semigroup #2
Se afișează postările cu eticheta BackTracking. Afișați toate postările
Laborator 13 - Test Backtracking (27 mai)
marți, 27 mai 2014
by DlMuresan
Categories:
BackTracking,
BackTracking in plan,
test
|
Leave a comment
Laborator 12 - Backtracking (20 mai)
Un labirint este codificat printr-o matrice de elemente ale cărui
culoare sunt reprezentate prin elemente egale cu 1, situate în poziţii
consecutive pe o aceeaşi linie sau coloană, celelalte elemente fiind 0. O
persoană se găseşte în poziţia (i, j) din interiorul labirintului. Se
cere afişarea tuturor traseelor de ieşire din labirint care nu trec de
mai multe ori prin acelaşi loc.
De fapt, se consideră intrarea prin punctul (1,1) şi ieşirea prin punctul (n,m).
#include <stdio.h>in.txt
#include <stdlib.h>
typedef struct punct
{
int l,c;
}pct;
int a[100][100];
int valid (pct p[100],int k)
{
if (a[p[k].l][p[k].c]==1)
return 1;
else
return 0;
}
void afis(pct p[100],int k,int n,int m)
{
int i,j;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
}
void back(int k,pct p[100],int n,int m)
{
int x,pi[]={0,1,0,-1},pj[]={-1,0,1,0};
for (x=0;x<=3;x++)
{
p[k].c=p[k-1].c+pi[x];
p[k].l=p[k-1].l+pj[x];
if (valid(p,k))
{
a[p[k].l][p[k].c]=2;
if (p[k].c==m && p[k].l==n)
{
afis(p,k,n,m);
}
else
{
back(k+1,p,n,m);
}
a[p[k].l][p[k].c]=1;
}
}
}
int main()
{
FILE *f;
int i,j,n,m;
pct p[100];
f=fopen("in.txt","r");
fscanf(f,"%d %d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
fscanf(f,"%d",&a[i][j]);
for (i=0;i<=m+1;i++)
{
a[0][i]=0;
a[n+1][i]=0;
}
for (i=0;i<=n+1;i++)
{
a[0][i]=0;
a[m+1][i]=0;
}
for (i=0;i<=n*m;i++)
{
p[i].c=0;
p[i].l=0;
}
p[1].c=1;
p[1].l=1;
a[1][1]=2;
back(2,p,n,m);
return 0;
}
5 6Colorarea grafurilor. Fiind dat un graf neorientat G =(X, Γ) unde X este mulţimea formată din n noduri, iar Γ este mulţimea muchiilor şi un număr de m culori, se cere să se determine toate colorările posibile ale nodurilor grafului folosind cele m culori, astfel încât oricare două noduri adiacente să fie colorate în mod diferit.
1 0 0 1 0 0
1 1 0 1 0 0
1 1 1 0 0 0
0 1 1 1 0 1
0 0 1 1 1 1
#include <stdio.h>in.txt
#include <stdlib.h>
int valid(int k,int x[],int a[100][100])
{
int i;
for (i=1; i<k; i++)
if (a[i][k]==1 && x[i]==x[k])
return 0;
return 1;
}
void afis(int x[],int n)
{
int i;
for (i=1; i<=n; i++)
{
printf("%d - %d ",i,x[i]);
}
printf("\n");
}
void back(int k,int c,int n,int m,int x[],int a[100][100])
{
int i;
for (i=1; i<=c; i++)
{
x[k]=i;
if (valid(k,x,a))
{
if (k==n)
afis(x,k);
else
back(k+1,c,n,m,x,a);
}
}
}
int main()
{
int a[100][100],n,m,c,i,j,x[100];
FILE *f;
f=fopen("in.txt","r");
fscanf(f,"%d %d %d",&n,&m,&c);
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
fscanf(f,"%d",&a[i][j]);
back(1,c,n,m,x,a);
return 0;
}
5 5 3Fiind date o tablă de şah de dimensiune pătrate şi un cal plasat în pătratul din stânga sus al tablei, să se afişeze toate posibilităţile de mutare a calului astfel încât să treacă o singură dată prin fiecare pătrat al tablei.
0 1 0 0 1
1 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
luni, 26 mai 2014
by DlMuresan
Categories:
BackTracking,
BackTracking in plan
|
Leave a comment
Laborator 11 - Backtracking (13 mai)
#include <stdio.h>Se consideră o mulţime formată din n elemente numere întregi. Să se genereze toate submulţimile acestei mulţimi având proprietatea că suma elementelor lor este egală cu S.
#include <stdlib.h>
int r[10],nr=0,n;
void afisare()
{
int i,j;
nr++;
for(i=1; i<n+1; i++)
{
for(j=1; j<n+1; j++)
if(r[i]==j)
printf("1");
else printf(".");
printf("\n");
}
printf("\n");
}
int verif(int i)
{
int j;
for(j=1; j<i; j++)
if(r[i]==r[j])
return 0;
for(j=1; j<i; j++)
if(abs(r[i]-r[j])==abs(i-j))
return 0;
return 1;
}
void back(int i)
{
int j;
for(j=1; j<=n; j++)
{
r[i]=j;
if(verif(i))
if(i==n)
afisare();
else back(i+1);
}
}
int main()
{
printf("n=");
scanf("%d",&n); // n global
back(1);
printf("%d solutii",nr);
printf("\nApasati o tasta pentru terminare");
getch();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int x[100],n,s,a[100];
void afisare(int n)
{
int i;
for(i=1; i<=n; i++)
printf("%d+",a[x[i]]);
printf("\b");
printf("\n");
}
void back(int i, int s)
{
int j,sr;
for(j=x[i-1]+1; j<=n; j++)
{
x[i]=j;
sr=s-a[x[i]];
if(sr==0)
afisare(i);
else if(sr)
back(i+1,sr);
}
}
int main()
{
int i;
printf("n=");
scanf("%d",&n);
printf("s=");
scanf("%d",&s);
for(i=1; i<=n; i++)
a[i]=i; // sau citirea elementelor vectorului
back(1,s);
printf("\nApasati o tasta pentru terminare");
getch();
return 0;
}
Aranjarea pe o tabla de sah n*n a m cai
#include <stdio.h>
#include <stdlib.h>
typedef struct punct{
int i,j;
}punct;
punct sol[100];
int x[100],n,m,a[100];
void afisare()
{
int i;
}
int verif(int k)
{
int i,j;
}
void back(int k)
{int j;
for(j=1;j<=n;j++)
{r[k]=j;
if(verif(k))
if(i==n)
afisare();
else back(k+1);
}
}
int main()
{
printf("n=");
scanf("%d",&n);
printf("m=");
scanf("%d",&m);
back(1);
printf("\nApasati o tasta pentru terminare");
getch();
return 0;
}
marți, 13 mai 2014
by DlMuresan
Categories:
8 regine,
BackTracking
|
Leave a comment
11/24 - Topcoder.com
Se da un numar n si multimea {1,2,3...n}. Sa se afiseze o submultime de lungime maxima care are proprietatea ca niciun element nu se imparte la niciun altul.
#include<iostream>
#include<fstream>
using namespace std;
int n,a[100],x[100],maxi[100],ma=0;
void afisare(int x[],int n)
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[i]%x[j]==0)
return 0;
return 1;}
void back(int i)
{int j;
for(j=x[i-1]+1;j<=n;j++)
{x[i]=j;
if(verif(i))
{if(i>ma)
{ma=i;
for(int k=1;k<=ma;k++)
maxi[k]=x[k];
}
back(i+1);
}
}
}
int main()
{int i;
cin>>n;
for(i=1;i<=n;i++)
a[i]=i;
back(1);
afisare(maxi,ma);
}
joi, 24 noiembrie 2011
by DlMuresan
Categories:
BackTracking,
Metoda Greedy
|
Leave a comment
11/3 - BackTracking in plan
Un labirint este codificat printr-o matrice L (n x m) ale cărui culoare sunt reprezentate prin elemente egale cu 0 situate in poziţii consecutive pe aceeaşi linie sau aceeaşi coloană.
O persoană este paraşutată în labirint în poziţia (is, js) din interiorul labirintului. Se cere afişarea tuturor traseelor de ieşire din labirint care nu trec de mai multe ori prin acelaşi loc.
Ieşirea din labirint se află pe marginea matricei.
#include<iomanip>Fisier
#include<iostream>
#include<fstream>
using namespace std;
int n,m,L[10][10],sol[10][10],nrsol=0,is,js;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
void citire()
{int i,j;
ifstream f("lab");
f>>n>>m>>is>>js;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
f>>L[i][j];
}
void afisare()
{int i,j;
nrsol++;
cout<<"Solutia nr "<<nrsol<<endl;
for(i=1;i<=n;i++)
{for(j=1;j<=m;j++)
cout<<setw(3)<<sol[i][j];
cout<<endl;}
cout<<endl;
}
void traseu(int i, int j, int pas)
{int inou,jnou,k;
for(k=0;k<4;k++)
{inou=i+dx[k];
jnou=j+dy[k];
if(inou>=1 && inou<=n && jnou>=1 && jnou<=m)
if(L[inou][jnou]==0 && sol[inou][jnou]==0)
{sol[inou][jnou]=pas;
if(inou==1 || inou==n || jnou==1 || jnou==m)
afisare();
traseu(inou,jnou,pas+1);
sol[inou][jnou]=0;}
}
}
int main()
{citire();
sol[is][js]=1;
traseu(is,js,2);
cout<<nrsol;
}
5 4
3 3
0 0 0 0
1 1 0 1
0 0 0 1
0 1 0 1
0 0 0 1
joi, 3 noiembrie 2011
by DlMuresan
Categories:
BackTracking,
BackTracking in plan
|
1 comment
10/31 - Hotul
Solutia I. Hotul are un rucsac cu care poate cara o greutate maxima G. Exista n obiecte carora li se cunoaste greutatea si valoarea. Sa se determine obiectele de valoare maxima <=G.
#include<iostream>Fisier
#include<fstream>
using namespace std;
int n,i,G[100],V[100],S[100],REZ[100];
int greutate,vmax;
void afis(int n, int s, int v)
{int k;
for (k=1;k<=n;k++)
cout<<S[k]<<" ";
cout<<"--"<<s<<"--"<<v<<endl;
}
void afiseaza ()
{
for (i=1;i<=n;i++)
if (REZ[i]!=0)
cout<<REZ[i]<<" ";
cout<<" ->> "<<vmax<<endl;
}
void back(int i, int s, int v)
{
int j,k;
for (j=0;j<=1;j++)
{
S[i]=j;
s=s+j*G[i];
v=v+j*V[i];
if (i==n)
{
afis(i,s,v);
if (s<=greutate)
if (v>vmax)
for (k=1;k<=n;k++)
{
REZ[k]=S[k]*V[k];
vmax=v;
}
}
else
if(s<greutate) back(i+1,s,v);
}
}
int main()
{
ifstream fin("rucsac.in");
fin>>n>>greutate;
vmax=-1;
for (i=1;i<=n;i++)
fin>>G[i]>>V[i];
back(1,0,0);
afiseaza();
return 0;
}
6 10Solutia II. Hotul are un rucsac cu care poate cara o greutate maxima G. Exista n obiecte carora li se cunoaste greutatea si valoarea. Sa se determine obiectele de valoare maxima <=G.
3 7
3 4
1 2
1 9
2 4
1 5
#include<iostream>Fisier
#include<fstream>
using namespace std;
int main()
{
int val=0,gr=0,j,V[100],G[100],i,n,greutate,p;
ifstream fin("rucsac.in");
cin>>n>>greutate;
for(i=1;i<=n;i++)
cin>>G[i]>>V[i];
for(i=1;i<=n;i++)
{ for(j=i+1;j<=n;j++)
{if(V[j]>V[i])
{swap(G[i],G[j]);
swap(V[i],V[j]);}
if(V[j]==V[i])
if(G[j]<G[i])
{swap(G[i],G[j]);
swap(V[i],V[j]);}
}
}
for(j=1;j<=n;j++)
{
gr=gr+G[j];
if(gr>greutate)
p=j;
}
for(i=1;i<p;i++)
{val=val+V[i];
cout<<G[i]<<" "<<V[i]<<endl;
}
cout<<"Valoare maxima: "<<val;
return 0;
}
6 10
3 7
3 4
1 2
1 9
2 4
1 5
luni, 31 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/24
Suma de bani. (bancnotele trebuie sa fie in ordine crescatoare)
#include<iostream>Sa se afiseze toate sirurile crescatoare care incep cu n si se termina cu n+k.
using namespace std;
int b[100],x[100],nr=0,n,f[100]={0},minim=INT_MAX,mi;
void afisare(int n)
{int i;
for(i=1;i<=n;i++)
if(x[i])
cout<<x[i]<<"*"<<b[i]<<" ";
cout<<endl;
nr++;}
int suma(int x[], int n)
{int i,s=0;
for(i=1;i<=n;i++)
s=s+x[i];
return s;
}
void back(int i,int s,int nrb)
{int j;
if(i==n)
{if(s%b[i]==0)
{x[i]=s/b[i];
afisare(i);
if(nrb+j<minim)
{minim=nrb+j;mi=i;
for(int k=1;k<=i;k++)
f[k]=x[k];}}
}
else{
for(j=0;j<=s/b[i];j++)
{x[i]=j;
if(s==j*b[i])
{afisare(i);
if(nrb+j<minim)
{minim=nrb+j;mi=i;
for(int k=1;k<=i;k++)
f[k]=x[k];}}
else back(i+1,s-j*b[i],nrb+j);
}
}
}
int main()
{int i,j,s,nrb=0;
cin>>s>>n;
for(i=1;i<=n;i++)
cin>>b[i];
back(1,s,0);
cout<<endl<<nr<<" solutii"<<endl;
for(j=1;j<=mi;j++)
if(f[j])
cout<<f[j]<<"*"<<b[j]<<" ";
}
#include<iostream>Sa se afiseze toate submultimile unei multimi care au suma elementelor egala cu o suma data.
using namespace std;
int x[100],n,k,nr=0;
int afisare(int n)
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
nr++;}
void back(int i)
{int j;
for(j=x[i-1]+1;j<=n+k;j++)
{x[i]=j;
if(j==n+k)
afisare(i);
else back(i+1);
}
}
int main()
{cin>>n>>k;
x[1]=n;
back(2);
}
#include <iostream>
#include <ctime>
using namespace std;
int x[100],n,s,a[100];
void afisare(int n)
{int i;
for(i=1;i<=n;i++)
cout<<a[x[i]]<<"+";
cout<<"\b ";
cout<<endl;
}
void back(int i, int s)
{int j,sr;
for(j=x[i-1]+1;j<=n;j++)
{x[i]=j;
sr=s-a[x[i]];
if(sr==0)
afisare(i);
else if(sr)
back(i+1,sr);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
cout<<"s=";cin>>s;
for(i=1;i<=n;i++)
cin>>a[i];
back(1,s);
}
duminică, 23 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/21
Bancnote
#include<iostream>
using namespace std;
int b[100],x[100],nr=0,n;
void afisare(int n)
{int i;
for(i=1;i<=n;i++)
if(x[i])
cout<<x[i]<<"*"<<b[i]<<" ";
cout<<endl;
nr++;}
void back(int i,int s)
{int j;
if(i==n)
{if(s%b[i]==0)
{x[i]=s/b[i];
afisare(i);}
}
else{
for(j=0;j<=s/b[i];j++)
{x[i]=j;
if(s==j*b[i])
afisare(i);
else back(i+1,s-j*b[i]);
}
}
}
int main()
{int i,j,s;
cin>>s>>n;
for(i=1;i<=n;i++)
cin>>b[i];
back(1,s);
cout<<endl<<nr<<" solutii";
}
joi, 20 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
Partitiile unui numar - 10/19
Sa se afiseze toate descompunerile unui numar in suma de cifre nenule distincte (partitiile numarului).
#include<iostream>Ordonate strict crescator
using namespace std;
int x[100],n;
int afisare(int n)
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<"+";
cout<<"\b ";
cout<<endl;}
int verif(int i)
{if(i>1 && x[i]<x[i-1])
return 0;
return 1;}
void back(int i,int s)
{int j;
for(j=1;j<=s;j++)
{x[i]=j;
if(x[i]==s)
afisare(i);
else back(i+1,s-x[i]);
}
}
int main()
{cin>>n;
back(1,n);
}
#include<iostream>Ordonate crescator (< sau =)
using namespace std;
int x[100]={0},n;
int afisare(int n)
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<"+";
cout<<"\b ";
cout<<endl;}
int verif(int i)
{if(i>1 && x[i]<x[i-1])
return 0;
return 1;}
void back(int i,int s)
{int j;
for(j=x[i-1]+1;j<=s;j++)
{x[i]=j;
if(x[i]==s)
afisare(i);
else back(i+1,s-x[i]);
}
}
int main()
{cin>>n;
back(1,n);
}
#include<iostream>
using namespace std;
int x[100]={0},n;
int afisare(int n)
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<"+";
cout<<"\b ";
cout<<endl;}
int verif(int i)
{if(i>1 && x[i]<x[i-1])
return 0;
return 1;}
void back(int i,int s)
{int j;
for(j=x[i-1];j<=s;j++)
{x[i]=j;
if(x[i]==s)
afisare(i);
else back(i+1,s-x[i]);
}
}
int main()
{cin>>n;
x[0]=1;
back(1,n);
}
miercuri, 19 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/17
1. Fazan
#include<iostream>
using namespace std;
int n,p,x[10],nr=0,c=0,v[100],Sm[100],mx=0;
char a[100][100];
int afisare(int n)
{for(int i=0;i<=n;i++)
cout<<a[x[i]]<<" ";
nr++;
cout<<endl;}
int verif(int i)
{if(i>1 && strcmp(a[x[i]],a[x[i-1]])==0)
return 0;
if(i==1 && (a[x[i]][0]!=a[x[i-1]][strlen(a[x[i-1]])-2] || a[x[i]][1]!=a[x[i-1]][strlen(a[x[i-1]])-1]))
return 0;
for(int j=1;j<i;j++)
if(x[i]==x[j])
return 0;
if(i>1 && (a[x[i]][0]!=a[x[i-1]][strlen(a[x[i-1]])-2] || a[x[i]][1]!=a[x[i-1]][strlen(a[x[i-1]])-1]))
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{
x[i]=j;
if(verif(i))
{afisare(i);
if(i>mx)
{mx=i;
for(int k=1;k<=i;k++)
Sm[k]=x[k];
}
if(i<=n)
back(i+1);
}
}
}
int main()
{int i,j,nn,k=0;
cin>>n;
for(i=0;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<endl<<"Cea mai lunga"<<endl;
for(i=0;i<=mx;i++)
cout<<a[Sm[i]]<<" ";
cout<<"este formatata din "<<mx<<" cuvinte";
cout<<endl<<nr<<" solutii";
}
duminică, 16 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/14
#include<iostream>
using namespace std;
int n,x[10],nr=0;
struct concurent{
int nr;
char tara[100];
}a[100];
int afisare(int n)
{for(int i=1;i<=n;i++)
cout<<a[x[i]].nr<<". "<<a[x[i]].tara<<endl;
nr++;
cout<<endl;}
int verif(int i)
{if(strcmp(a[x[i]].tara,a[x[i-1]].tara)==0)
return 0;
for(int j=1;j<i;j++)
if(a[x[i]].nr==a[x[j]].nr)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare(n);
else back(i+1);
}
}
int main()
{int i,j;
cin>>n;
for(i=1;i<=n;i++)
{a[i].nr=i;
cin>>a[i].tara;
}
back(1);
cout<<nr<<" solutii";
}
#include<iostream>
using namespace std;
int n,p,x[10],nr=0;
struct cub{
int l;
char culoare[100];
}a[100];
int afisare(int n)
{for(int i=1;i<=n;i++)
cout<<a[x[i]].l<<" "<<a[x[i]].culoare<<endl;
nr++;
cout<<endl;}
int verif(int i)
{if(i>1 && strcmp(a[x[i]].culoare,a[x[i-1]].culoare)==0)
return 0;
for(int j=1;j<i;j++)
if(x[i]==x[j])
return 0;
if(i>1 && a[x[i]].l>a[x[i-1]].l)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==p)
afisare(p);
else back(i+1);
}
}
int main()
{int i,j;
cout<<"n=";cin>>n;
cout<<"p=";cin>>p;
for(i=1;i<=n;i++)
{cin>>a[i].l>>a[i].culoare;
}
cout<<endl<<"---------"<<endl;
back(1);
cout<<nr<<" solutii";
}
#include<iostream>
using namespace std;
int n,p,x[10],nr=0,c=0,v[100];
char a[11][5]={"*","!","abc","def","ghi","jkl","mno","pqrs","tuv","xywz"};
int afisare(int n)
{int k=1;
for(int i=0;i<n;i++)
{cout<<a[v[i]][x[i]]<<" ";
k=k*10;}
nr++;
cout<<endl;}
int verif(int i)
{
if(x[i]>=strlen(a[v[i]]))
return 0;
else return 1;
}
void back(int i)
{int j;
for(j=0;j<=3;j++)
{
x[i]=j;
if(verif(i))
if(i==n)
afisare(n);
else back(i+1);
}
}
int main()
{int i,j,nn;
cin>>n;
for(i=0;i<n;i++)
cin>>v[i];
back(0);
cout<<nr<<" solutii";
}
vineri, 14 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
1 comment
10/13
Sa se genereze submultimile multimii {1,2,...,n}
#include<iostream>
using namespace std;
int n,x[10],nr=0;
void afisare(int n)
{for(int i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;nr++;
}
void rec(int i)
{int j;
for(j=x[i-1]+1;j<=n;j++)
{x[i]=j;
afisare(i);
rec(i+1);}}
int main()
{cin>>n;rec(1);
cout<<nr<<" solutii";}
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/11
Sa se afiseze elementele produsului cartezian a n multimi. Fiecare multime contine litere mici din alfabet.
#include<iostream>
using namespace std;
int n,nr=0;
char a[10][10],x[10];
void back(int i)
{int j;
for(j=0;j<strlen(a[i]);j++)
{x[i]=a[i][j];
if(i==n)
{cout<<x+1<<endl;nr++;}
else back(i+1);}
}
int main()
{int i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
x[n+1]=NULL;
back(1);
cout<<nr<<" solutii";}
marți, 11 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/10
1. Să se genereze toate codurile de lungime n morse formate din '.' şi '-' astfel încât să nu existe două puncte alăturate.
#include<iostream>2. Sa se aranjeze 8 regine pe tabla de şah astfel încât acestea să nu se atace. Două regine se atacă dacă sunt situate pe aceeaşi coloană, rând sau diagonală.
using namespace std;
char x[100];
int n,nr=0;
int verif(int i)
{if(i>1 && x[i]=='.' && x[i-1]=='.')
return 0;
else return 1;
}
void back(int i)
{char j;
for(j='-';j<='.';j=j+'.'-'-')
{x[i]=j;
if(verif(i))
if(i==n)
{ cout<<x+1<<endl;nr++;}
else back(i+1);
}
}
int main()
{cin>>n;
x[n+1]=NULL;
back(1);
cout<<endl<<nr<<" solutii";
}
#include<iostream>
using namespace std;
int r[10],nr=0;
void afisare()
{int i,j;
nr++;
for(i=1;i<9;i++)
{for(j=1;j<9;j++)
if(r[i]==j)
cout<<'.';
else cout<<'X';
cout<<endl;}
cout<<endl;}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(r[i]==r[j])
return 0;
for(j=1;j<i;j++)
if(abs(r[i]-r[j])==abs(i-j))
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<9;j++)
{r[i]=j;
if(verif(i))
if(i==8)
afisare();
else back(i+1);
}
}
int main()
{
back(1);
cout<<endl<<nr<<" solutii";
}
luni, 10 octombrie 2011
by DlMuresan
Categories:
8 regine,
BackTracking
|
Leave a comment
10/5
1. Se citesc n nr nat. Sa se afiseze toate posibilitatile de plasare in fata numerelor a semnelor + sau - astfel incat expresia care se obtine sa aiba valoarea s.
#include<iostream>2. Sa se genereze produsul cartezian {1,2,...,m}x{1,2,...,m} de n ori.
using namespace std;
int a[100],x[100],n,s,nr=0;
void afisare()
{int i;
for(i=1;i<=n;i++)
if(x[i]==1)
cout<<"+"<<x[i]*a[i];
else cout<<x[i]*a[i];
cout<<endl;
nr++;
}
int verif(int i)
{int ss=0,j;
if(i!=n)
return 1;
for(j=1;j<=n;j++)
ss=ss+(x[j]*a[j]);
if(ss!=s)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=-1;j<=1;j+=2)
{x[i]=j;
if(verif(i))
if(i==n)
afisare();
else back(i+1);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
cout<<"s=";cin>>s;
for(int i=1;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<nr<<" solutii";
}
#include<iostream>3. O persoana a uitat nr de tel. Stie doar ca numarul are 6 cifre, incepe cu 4 si contine 3 cifre de 0, dintre care doua sunt alaturate. Afisati toate variantele.
using namespace std;
int a[100],x[100],n,m,nr=0;
void afisare()
{int i;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
nr++;
}
void back(int i)
{int j;
for(j=1;j<=m;j++)
{x[i]=j;
if(i==n)
afisare();
else back(i+1);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
cout<<"m=";cin>>m;
back(1);
cout<<endl<<nr<<" solutii";
}
#include<iostream>4. Sa se genereze toate palindroamele de lungime n.
using namespace std;
int x[11],nr=0;
void afisare()
{int i;nr++;
for(i=1;i<7;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{int j,s=0,ok=0;
if(i>=4 && x[i]==0 && x[i-1]==0 && x[i-2]==0)
return 0;
if(i==6)
{for(j=3;j<7;j++)
if(x[j]==0 && x[j-1]==0)
ok=1;
if(ok==0)
return 0;
for(j=2;j<7;j++)
if(x[j]==0)
s++;
if(s!=3)
return 0;
}
return 1;
}
void back(int i)
{int j;
for(j=0;j<10;j++)
{x[i]=j;
if(verif(i))
if(i==6)
afisare();
else back(i+1);}
}
int main()
{x[1]=4;
back(2);
cout<<nr;
}
#include<iostream>
using namespace std;
int x[11],n,nr=0;
void afisare()
{int i;nr++;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{if(i==1 && x[i]==0)
return 0;
if(n%2==1)
if(i>n/2)
if(x[i]!=x[n-i+1])
return 0;
if(n%2==0)
if(i>n/2)
if(x[i]!=x[n-i+1])
return 0;
return 1;
}
void back(int i)
{int j;
for(j=0;j<10;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare();
else back(i+1);}
}
int main()
{
cin>>n;
back(1);
cout<<endl<<nr<<" solutii";
}
marți, 4 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/4
1. Sa se genereze toate coadele de 5 cifre cu urmatoarele restrictii: cifrele iau valori de la 1 la 9, numar impar pe ultima pozitie, suma a doua cifre alaturate sa fie minim 4, cifrele sa fie distinct
#include<iostream>2. Sa se genereze toate nr de telefon care incep cu 074 sau 075 (10 cifre), nu contin 3 cifre identice alaturate si contin cel putin doua cifre impare pe ultimele 7 pozitii.
using namespace std;
int x[6],nr=0;
void afisare()
{int i;
for(i=1;i<6;i++)
cout<<x[i]<<" ";
cout<<endl;
nr++;
}
int verif(int i)
{int j,k,v[100]={0};
if(i==5 && x[i]%2==0)
return 0;
if(i>1 && x[i]+x[i-1]<4)
return 0;
if(i==5)
for(j=1;j<6;j++)
v[x[j]]++;
for(j=0;j<10;j++)
if(v[j]>1)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<10;j++)
{x[i]=j;
if(verif(i))
if(i==5)
afisare();
else back(i+1);
}}
int main()
{back(1);
cout<<endl<<nr;}
#include<iostream>
using namespace std;
int x[11],nr=0;
void afisare()
{int i;nr++;
for(i=1;i<11;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{int j,s=0;
for(j=1;j<i;j++)
if(x[i]==x[j])
return 0;
if(i>4 && x[i]==x[i-1] && x[i-1]==x[i-2])
return 0;
if(i==10)
{for(j=4;j<11;j++)
if(x[j]%2==1)
s++;
if(s<2)
return 0;
}
return 1;
}
void back(int i)
{int j;
for(j=0;j<10;j++)
{x[i]=j;
if(verif(i))
if(i==10)
afisare();
else back(i+1);}
}
int main()
{x[1]=0;x[2]=7;x[3]=4;
back(4);
cout<<endl<<endl<<"+++++++++++++++++++"<<endl<<endl<<nr<<endl<<endl;
nr=0;
x[3]=5;back(4);
cout<<endl<<endl<<nr;
}
luni, 3 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
10/3 - Probleme BackTracking
1. A) Sa se genereze in ordine lexico-grafica cuvintele din multimea a-h cu n litere si care nu contin doua vocale alaturate.
#include<iostream>B) Sa se genereze cuvintele de k litere care incep cu o vocala si se termina cu o consoana.
using namespace std;
int nr=0,n,x[10];
char a[10]=" abcdefgh";
void afisare(int n)
{int i;
nr++;
for(i=1;i<=n;i++)
cout<<a[x[i]];
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i] || strchr("aeiou",a[x[i]])!=0 && strchr("aeiou",a[x[i-1]])!=0 && i>1)
return 0;
return 1;}
void back(int i)
{int j;
for(j=1;j<=8;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare(n);
else back(i+1);
}
}
int main()
{cin>>n;
back(1);
cout<<endl<<nr;
}
#include<iostream>2. n copii sunt pregatiti pentru ora de sport. Se cunoaste inaltimea fiecaruia. Trebuie alesi k copii insirati pe un rand astfel incat diferenta dintre oricare 2 elevi sa nu fie mai mare de 10 cm.
using namespace std;
int nr=0,n,x[10],k;
char a[10]=" abcdefgh";
void afisare(int k)
{int i;
nr++;
for(i=1;i<=k;i++)
cout<<a[x[i]];
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i])
return 0;
if(i==1 && strchr("aeiou",a[x[i]])==0)
return 0;
if(i==k && strchr("aeiou",a[x[i]])!=0)
return 0;
return 1;}
void back(int i)
{int j;
for(j=1;j<=8;j++)
{x[i]=j;
if(verif(i))
if(i==k)
afisare(k);
else back(i+1);
}
}
int main()
{cin>>k;
back(1);
cout<<endl<<nr;
}
#include<iostream>3. Sa se scrie un algoritm BackTracking care genereaza toate sirurile de 5 cifre 0 si 1 astfel incat sa nu existe mai mult de doua cifre de 0 alaturate.
using namespace std;
int nr=0,n,x[10],k;
int a[100];
void afisare(int k)
{int i;
nr++;
for(i=1;i<=k;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i])
return 0;
if(i>1 && abs(a[x[i]]-a[x[i-1]])>10)
return 0;
return 1;}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==k)
afisare(k);
else back(i+1);
}
}
int main()
{cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(int i=1; i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<nr;
}
#include<iostream>5. n persoane stau pe scaune numerotate de la 1 la n. Oricare doi vecini se ceartă. Să se afişeze toate posibilităţile de a-i reaşeza pe scaune astfel încât să nu fie 2 foşti vecini alăturaţi.
using namespace std;
int nr=0,n,x[10],k;
char a[10]=" 01";
void afisare()
{int i;
nr++;
for(i=1;i<=5;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(i>1 && a[x[i]]=='0' && a[x[i-1]]=='0')
return 0;
return 1;}
void back(int i)
{int j;
for(j=1;j<=2;j++)
{x[i]=j;
if(verif(i))
if(i==5)
afisare();
else back(i+1);
}
}
int main()
{back(1);
cout<<endl<<nr;
}
#include<iostream>
using namespace std;
int nr=0,n,x[100],k;
char a[10]=" 01";
void afisare(int n)
{int i;
nr++;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i])
return 0;
if(i>1 && abs(x[i]-x[i-1])<=1)
return 0;
return 1;}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare(n);
else back(i+1);
}
}
int main()
{int i;
cin>>n;
for(i=1;i<=n;i++)
x[i]=i;
back(1);
cout<<endl<<nr;
}
duminică, 2 octombrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
9/30
1. Se da un vector cu nr intregi cu valori distincte. Se cere sa afisati toate posibilitatile de a alege k din cele n citite astfel incat oricare doua nr alaturate sa fie de paritati diferite.
#include<iostream>1.II.
using namespace std;
int a[10];
int n,x[10],nrsol,k;
int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i] || a[x[i]]%2==a[x[i-1]]%2 && i>1)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==k)
afisare();
else back(i+1);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
#include<iostream>2. Se citesc n culori. Sa se formeze toate drapelele de 3 culori astfel incat oricare doua culori alaturate sa fie distincte.
using namespace std;
int a[10];
int n,x[10],nrsol,k;
int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i] || x[i]%2==x[i-1]%2 && i>1)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=a[j];
if(verif(i))
if(i==k)
afisare();
else back(i+1);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
cout<<"k=";cin>>k;
for(i=1;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
#include<iostream>
using namespace std;
char a[10][10];
int n,x[10],nrsol,k;
int afisare()
{int i;
nrsol++;
for(i=1;i<=k;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i] || x[i]==x[i-1] && i>1)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==k)
afisare();
else back(i+1);
}
}
int main()
{int i;
cout<<"n=";cin>>n;
k=3;
for(i=1;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
joi, 29 septembrie 2011
by DlMuresan
Categories:
BackTracking
|
Leave a comment
9/29 - Backtracking
Se citesc de la tastatura numele a n copii. Sa se afiseze toate posibilitatile de aranjare a acestora pe n scaune.
#include<iostream>n camile sunt asezate in sir indian. Sa se afiseze toate posibilitatile de rearanjare a acestora astfel incat o camila sa aiba in fata ei o camila diferita de cea din configuratia initiala.
using namespace std;
char a[10][10];
int n,x[10],nrsol;
int afisare()
{int i;
nrsol++;
for(i=1;i<=n;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i])
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare();
else back(i+1);
}
}
int main()
{int i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
#include<iostream>
using namespace std;
int n,x[10],nrsol;
int afisare()
{int i;
nrsol++;
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
}
int verif(int i)
{int j;
for(j=1;j<i;j++)
if(x[j]==x[i] || x[i]-x[i-1]==1 && i>1)
return 0;
return 1;
}
void back(int i)
{int j;
for(j=1;j<=n;j++)
{x[i]=j;
if(verif(i))
if(i==n)
afisare();
else back(i+1);
}
}
int main()
{int i;
cin>>n;
back(1);
cout<<endl<<"Nr. sol= "<<nrsol;
}
by DlMuresan
Categories:
BackTracking,
subprograme,
subprograme vectori interschimbare recursivitate sortare info,
vectori
|
Leave a comment