Ovo bi lepo moglo da se reši rekurzivno. Imaš rekurzivnu funkciju koja bira sledeći broj, i kad ga odabere onda poziva samu sebe da odabere sledeći i sledeći, sve dok ne napravi osmocifrenu kombinaciju. Ta kombinacija se ispisuje, a rad nastavlja.
Svaka trenutna pozicija ima skup dozvoljenih sledećih pozicija. Ta lista skupova bi izgledala ovako:
1: 6, 8
2: 7, 9
3: 4, 8
4: 3, 9, 0
5: *, #
6: 1, 7, 0
7: 2, 6, #
8: 1, 3
9: 2, 4, *
0: 4, 6
Rekurzivna funkcija bi prosto mogla da ima jedan switch u kome se gleda trenutna pozicija, i poziva funkcija rekurzivno za svaku moguću sledeću poziciju. Na primer:
Code:
void prikazi_resenje(char trenutna_pozicija)
{
static int indeks_trentune_pozicije = 0;
static char trenutno_resenje[9] = {0};
if ((trenutna_pozicija == '#' || trenutna_pozicija == '*') && indeks_trenutne_pozicije != 7)
return; // Ova dva znaka su dozvoljena samo na kraju
// Indeks se ovde povećava, i obavezno mora da se smanji pre izlaska iz funkcije
trenutno_resenje[indeks_trenutne_pozicije++] = trenutna_pozicija;
if (indeks_trenutne_pozicije == 8)
printf("%s\n", trenutno_resenje);
else
{
switch (trenutna_pozicija)
{
case '1':
prikazi_resenje('6');
prikazi_resenje('8');
break;
// Slično i za ostale
}
}
--indeks_trenutne_pozicije;
}
Tja, lakše mi je da napišem skoro čitavu funkciju, nego da objasnim :-). Nemoj samo da mi se žališ da ovo ne radi, cilj mi nije bio da ti dam rešenje, nego da ti objasnim kako rešenje treba da izgleda. Ako ne radi onda sam pronađi grešku. Interesantno je da broj 5 nikako ne može da bude deo 8-cifrene kombinacije, ali to nije bitno za rešenje zadatka.
Iz glavne funkcije pozivaš ovu rekurzivnu u petlji koja ide od '2' do '9' (obrati pažnju da nije od 2 do 9, nego od '2' do '9'). I to je to.