Sunteți pe pagina 1din 3

Problema drapelelor rezolvată în C++

(cu tehnica backtracking)

Avem la dispoziţie 6 culori: alb, galben, roşu, verde, albastru şi negru. Să se precizeze
toate drapelele tricolore care se pot proiecta, ştiind că trebuie respectate regulile:
 Orice drapel are culoarea din mijloc galben sau verde;
 Cele trei culori de pe drapel sunt distincte.
#include<conio.h> #include<conio.h>
#include<iostream.h> #include<iostream.h>
char cul[6] char cul[6]
[10]={"alb","galben","rosu","verde","albastru"," [10]={"alb","galben","rosu","verde","albastru","
negru"}; negru"};
int k,st[4]; int k,st[4];
void init(int k) void init(int k)
{st[k]=-1;} {st[k]=-1;}
void tipar() void tipar()
{int i; {int i;
for(i=0;i<3;i++) for(i=0;i<3;i++)
cout<<cul[st[i]]<<" "; { switch(st[i])
cout<<endl; {case 0:textcolor(15);break;
getch(); case 1:textcolor(14);break;
} case 2:textcolor(4);break;
int succesor(int k) case 3:textcolor(2);break;
{ if(st[k]<5) case 4:textcolor(1);break;
{st[k]++; case 5:textcolor(7|BLINK);break;
return 1; }
} cprintf(cul[st[i]]);
else return 0; cprintf(" ");}
} cout<<endl;
int valid(int k) getch();
{int ev=1,i; }
if(k==1) int succesor(int k)
if((st[k]!=1)&&(st[k]!=3)) { if(st[k]<5)
ev=0; {st[k]++;
for(i=0;i<k;i++) return 1;
if(st[i]==st[k])ev=0; }
return ev; else return 0;
} }
void back(int k) int valid(int k)
{ if(k==3)tipar(); {int ev=1,i;
else{ init(k); if(k==1)
while(succesor(k)) if((st[k]!=1)&&(st[k]!=3))
if(valid(k))back(k+1); ev=0;
} for(i=0;i<k;i++)
} if(st[i]==st[k])ev=0;
void main() return ev;
{textcolor(LIGHTBLUE); }
back(0); void back(int k)
} { if(k==3)tipar();
else{ init(k);
while(succesor(k))
if(valid(k))back(k+1); }
}
void main()
{textcolor(LIGHTBLUE);
back(0);}
Constante simbolice Valoare numerică
BLACK 0
BLUE 1
CREEN 2
CYAN 3
RED 4
MAGENTA 5
BROWN 6
LIGHTGRAY 7
DARKGRAY 8
LIGHTBLUE 9
LIGHTGREEN 10
LIGHTCYAN 11
LIGHTRED 12
LIGHTMAGENTA 13
YELLOW 14
WHITE 15
BLINK 128

S-ar putea să vă placă și