luni, 17 decembrie 2012

Problema C++ - Colorarea hartilor

Enunt: Fie o harta cu n tari si m culori, m>=4. Sa se coloreze harta astfel incat doua tari vecine sa nu aiba aceeasi culoare.


#include<string.h>
#include<iostream.h>
int v[100],a[100][100],n,i,j,k,m;
char culoare[100][30];

void afisare()
{ int i;
for(i=1;i<=n;i++)
{cout<<i<<culoare[v[i]];
cout<<endl;}}

int cont(int k)
{for(i=1;i<=k-1;i++)
if(a[i][k]==1 && v[i]==v[k])
return 0;
return 1;}

void back(int k)
{int i;
for(i=1;i<=m;i++)
{v[k]=i;
if(cont(k)==1)
if(k==n)
afisare();
else
back(k+1);}}

int main()
{cout<<"n=";
cin>>n;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
  {cin>>a[i][j];
    a[j][i]=a[i][j];}
cout<<"m=";
cin>>m;
for(i=1;i<=m;i++)
 {cout<<"dati culoare"<<endl;
   cin>>culoare[i];}
back(1);
return 0;}

Problema in C++ -Multimi (submultimi)

Enunt: Sa se afiseze toate posibilitatile ca n studenti sa dea m examene.


#include<iostream.h>
int v[100],n,k,t,i,m;
void afisare()
{int i;
t=t+1;
cout<<"solutia n"<<t<<endl;
for(i=1;i<=m;i++)
cout<<v[i]<<' ';
cout<<endl; }

int cont(int k)
{ for(i=1;i<=k-1;i++)
if(v[k]<=v[i])
return 0;
return 1; }

void back(int k)
{int i;
for(i=1;i<=n;i++)
{v[k]=i;
if(cont(k)==1)
if(k==m)
afisare();
else
back(k+1);}}

int main()
{cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
t=0;
back(1);
return 0;}

2 margele alaturate sa aiba aceeasi culoare

#include<iostream.h>
int v[100],n,i,j,t,k,m,x;
char culoare [100][30];
void afisare()
{ int i;
t=t+1;
for(i=1;i<=n;i++)
{cout<<v[i]<<' '<<culoare[v[i]];}
cout<<endl;}

int cont(int k)
{ int i;
if(v[k]= =v[k-2]&&k>2)
return 0;
if(v[k]!=v[k-1]&&k>1&& k%2= =0)
    return 0;
if(k= =n&&v[k]= =v[1])
return 0;
return 1;}

void back(int k)
{int i;
for(i=1;i<=m;i++)
{v[k]=i;
if(cont(k)= =1)
if(k= =n)
afisare();
else
back(k+1); }}

int main()
{cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
t=0;
for(i=1;i<=m;i++)
{cout<<"dati culoare"<<endl;
cin>>culoare[i];}
back(1);
cout<<t<<"solutii"<<endl;
return 0;}

Problema 37 (variante teza)

//Intre n persoane care stau pe scaune s-au iscat conflicte. Acestea stau pe scaune numerotate de la 1 la n. Scrieti un program care sa afiseze toate modurile posibile de reasezare a persoanelor astfel incat sa nu se gaseasca alaturi doua persoane in conflict.

#include<iostream.h>
int v[100],i,j,k,n,t;
char a[100][100];
void afisare()
{ int i;
t=t+1;
for(i=1;i<=n;i++)
{cout<<a[v[i]]<<' ';}
cout<<endl;}

int cont(int k)
{ for(i=1;i<=k-1;i++)
if(v[i]==v[k])
return 0;
if(abs(v[k]-v[k-1])==1)
return 0;
if(k==n && v[k]==v[1])
return 0;
return 1;}

void back(int k)
{int i;
for(i=1;i<=n;i++)
{v[k]=i;
if(cont(k)==1)
if(k==n)
afisare();
else
back(k+1);}}

int main()
{cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
back(1);
return 0;}

Problema 23 (variante teza)

23. Sa se genereze n perechi de paranteze care se inchid corect. Exemplu: n=3: ( ( ( ) ) ) ( ( ) ( ) ) ( ) ( ( ) ) etc


#include<iostream.h>
int v[100],i,j,k,n,t;

void afisare()
{ int i;
for(i=1;i<=2*n;i++)
if(v[i]==1)
cout<<"(";
else
cout<<")";
cout<<endl;}


int cont(int k)
{int si,sd;
si=0;
sd=0;
for(i=1;i<=k;i++)
if(v[i]==1)
sd=sd+1;
else
si=si+1;
if(si>sd)
return 0;
if(k==2*n && si!=sd)
return 0;
return 1; }

void back(int k)
{int i;
for(i=1;i<=2;i++)
{v[k]=i;
if(cont(k)==1)
if(k==2*n)
afisare();
else
back(k+1);}}

int main()
{cout<<"n=";
cin>>n;
back(1);
return 0;}

Problema 63 (variante teza)

//63. Sa se genereze toate numerele naturale ale caror cifre se gasesc printre cifrele lui x citit si au lungimea cel mult egala cu lungimea lui x. Cifrele se pot repeta

#include<iostream.h>
int v[100],i,j,n,x,k,a[100];
void afisare(int k)
{int i;
for(i=1;i<=k;i++)
cout<<a[v[i]]<<' ';
cout<<endl;}

void back(int k)
{int i;
for(i=1;i<=n;i++)
 {v[k]=i;
afisare(k);
if(k<n)
back(k+1);}}

int main()
{cout<<"x=";
cin>>x;
while(x!=0)
{j++;
a[j]=x%10;
x=x/10;
n++;}
back(1);}

produs cartezian

#include<iostream.h>
int v[100],i,j,n,x,k,a[100];
void afisare()
{int i;
for(i=1;i<=n;i++)
cout<<v[i]<<' ';
cout<<endl;}

void back(int k)
{int i;
for(i=1;i<=n;i++)
 {v[k]=i;
if(k==n)
afisare();
else
back(k+1);}}

int main()
{cout<<"n=";
cin>>n;
back(1);}