Sunteți pe pagina 1din 3

Problema drapelelor rezolvat n C++

(cu tehnica backtracking)


Avem la dispoziie 6 culori: alb, galben, rou, 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<iostream.h>
char cul[6]
[10]={"alb","galben","rosu","verde","albastru","
negru"};
int k,st[4];
void init(int k)
{st[k]=-1;}
void tipar()
{int i;
for(i=0;i<3;i++)
cout<<cul[st[i]]<<" ";
cout<<endl;
getch();
}
int succesor(int k)
{ if(st[k]<5)
{st[k]++;
return 1;
}
else return 0;
}
int valid(int k)
{int ev=1,i;
if(k==1)
if((st[k]!=1)&&(st[k]!=3))
ev=0;
for(i=0;i<k;i++)
if(st[i]==st[k])ev=0;
return ev;
}
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);
}

#include<conio.h>
#include<iostream.h>
char cul[6]
[10]={"alb","galben","rosu","verde","albastru","
negru"};
int k,st[4];
void init(int k)
{st[k]=-1;}
void tipar()
{int i;
for(i=0;i<3;i++)
{ switch(st[i])
{case 0:textcolor(15);break;
case 1:textcolor(14);break;
case 2:textcolor(4);break;
case 3:textcolor(2);break;
case 4:textcolor(1);break;
case 5:textcolor(7|BLINK);break;
}
cprintf(cul[st[i]]);
cprintf(" ");}
cout<<endl;
getch();
}
int succesor(int k)
{ if(st[k]<5)
{st[k]++;
return 1;
}
else return 0;
}
int valid(int k)
{int ev=1,i;
if(k==1)
if((st[k]!=1)&&(st[k]!=3))
ev=0;
for(i=0;i<k;i++)
if(st[i]==st[k])ev=0;
return ev;
}
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
BLUE
CREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
BLINK

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
128

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