Pentru Pbinfo.ro
#3149. Se citește un cuvânt format din cel puțin două și cel mult zece caractere litere mici distincte care conține cel puțin două vocale. Afișați în ordine lexicografică anagramele cuvântului citit care au proprietatea că încep și se termină cu o vocală.
#3154. Se citește de la tastatură un cuvânt s format din cel mult 11 litere mici distincte. Să se genereze în ordine alfabetică și să se afișeze toate anagramele cuvântului s în care vocalele sunt puncte fixe.
#3155. Se citește de la tastatură un cuvânt s format din cel mult 11 litere mici distincte. Să se genereze în ordine alfabetică și să se afișeze toate anagramele cuvântului s în care consoanele sunt puncte fixe.
Va rog mult daca are cineva aceste probleme cu backtracking cu solutie de 100p.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <cstring>
using namespace std;
int st[20], n, i, j;
char s[20], aux, v[10]="aeiou";
void afisare(int k)
{
int i;
for(i=1;i<=k;i++)
cout<<s[st[i]];
cout<<endl;
}
int valid(int k)
{
int ev,i;
ev=1;
for(i=1;i<=k-1;i++)
if(st[k]==st[i])
ev=0;
if(k==1||k==n)
{if(strchr(v,s[st[k]])==0)
ev=0;}
return ev;
}
void back(int k)
{
int i;
for(i=0;i<=n-1;i++)
{
st[k]=i;
if(valid(k))
if(k==n)
afisare(k);
else
back(k+1);
}
}
int main()
{
cin>>s;
n=strlen(s);
for(i=0;i<=n-2;i++)
for(j=i+1;j<=n-1;j++)
if(s[i]>s[j])
{
aux=s[i];
s[i]=s[j];
s[j]=aux;
}
back(1);
return 0;}
Explicație:
Aici ai o rezolvare de 80 de puncte pe care am facut -o in clasa cu profesorul de info. El a zis ca nu se stie la ce functie de ordonare a cuvintelor s-a gandit autorul problemei incat sa dispara limita de timp depasita.
P.S:Daca cumva gasesti niste variabile in plus, sunt de la alta problema, nu te incurca cu nimic.