online: 9; azi: 450; total: 50905 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Într-un restaurant, un meniu este format din trei feluri de mâncare. Există patru preparate culinare pentru felul unu, cinci preparate culinare pentru felul doi şi trei preparate culinare pentru felul 3. Să se genereze toate meniurile care se pot forma cu aceste preparate culinare.
# include < iostream >
using namespace std ;
typedef char stiva[ 3 ][ 20 ];
int n[ 3 ];
stiva st;
void init ( int k) {
st[k][ 0 ] = '\0' ;
}
int succesor ( int k) {
int idx = 0 ;
while (st[k - 1 ][ idx ] != '\0' && st[k][ idx ] == st[k - 1 ][ idx ]) {
idx ++;
}
if (st[k - 1 ][ idx ] != '\0' ) {
st[k][ idx ] = st[k - 1 ][ idx ] + 1 ;
st[k][ idx + 1 ] = '\0' ;
return 1 ;
} else {
return 0 ;
}
}
int valid ( int k) {
return 1 ;
}
int solutie ( int k) {
return k == 3 ;
}
void tipar () {
for ( int i = 0 ; i < 3 ; ++i) {
cout << st[i] << ' ' ;
}
cout << endl ;
}
void bt ( int k) {
init (k);
while ( succesor (k)) {
if ( valid (k)) {
if ( solutie (k)) {
tipar ();
} else {
bt (k + 1 );
}
}
}
}
int main () {
for ( int i = 0 ; i < 3 ; ++i) {
cin >> n[i];
}
char dishes [ 3 ][ 5 ][ 20 ] = {
{ "ciorba1" , "ciorba2" , "ciorba3" , "ciorba4" },
{ "friptura1" , "friptura2" , "friptura3" , "friptura4" , "friptura5" },
{ "clatite1" , "clatite2" , "clatite3" }};
for ( int i = 0 ; i < 3 ; ++i) {
for ( int j = 0 ; j < n[i]; ++j) {
st[i][j] = dishes [i][ 0 ][j];
}
}
bt ( 1 );
return 0 ;
}
Cu toate acestea, acest cod nu funcționează corect, deoarece metoda succesor() nu parcurge toate preparatele culinare în mod corespunzător . Asadar va recomand o alta abordare mai usor de inteles .
# include < iostream >
const int MAX_SETS = 3 ;
const int MAX_DISHES = 5 ;
const int MAX_DISH_NAME = 20 ;
void backtracking ( int level , char dishes [MAX_SETS][MAX_DISHES][MAX_DISH_NAME], char menu [MAX_SETS][MAX_DISH_NAME]) {
if ( level == MAX_SETS) {
for ( int i = 0 ; i < MAX_SETS; ++i) {
std :: cout << menu [i] << ' ' ;
}
std :: cout << std :: endl ;
return ;
}
for ( int i = 0 ; i < MAX_DISHES && dishes [ level ][i][ 0 ] != '\0' ; ++i) {
for ( int j = 0 ; j < MAX_DISH_NAME; ++j) {
menu [ level ][j] = dishes [ level ][i][j];
if ( dishes [ level ][i][j] == '\0' ) break ;
}
backtracking ( level + 1 , dishes , menu );
}
}
int main () {
int dish_counts [MAX_SETS] = { 4 , 5 , 3 };
char dishes [MAX_SETS][MAX_DISHES][MAX_DISH_NAME] = {
{ "ciorba1" , "ciorba2" , "ciorba3" , "ciorba4" },
{ "friptura1" , "friptura2" , "friptura3" , "friptura4" , "friptura5" },
{ "clatite1" , "clatite2" , "clatite3" }
};
char menu [MAX_SETS][MAX_DISH_NAME] = { 0 };
backtracking ( 0 , dishes , menu );
return 0 ;
}