Bunaa! VREAU DOAR SA IMI SPUNETI UNDE E GRESIT,DE CE NU DA BINE REZOLVAREA
PROBLEMA #205 PBINFO
Cerinţa
Se citeşte un număr natural nenul n şi o permutare a mulţimii M={1,2,..,n}. Să se afişeze, în ordine lexicografică, toate permutările mulţimii M care nu conţin elemente alăturate care au fost alăturate şi în permutarea dată.
Date de intrare
Fişierul de intrare shuffle.in conţine pe prima linie numărul n, iar pe a doua linie n valori distincte cuprinse între 1 și n, separate prin câte un spațiu, reprezentând permutarea dată.
Date de ieşire
Fişierul de ieşire shuffle.out va conţine pe fiecare linie elementele unei permutări, separate prin câte un spaţiu.
Restricţii şi precizări
0 < n < 9
dacă nu există soluţii se va afişa pe prima linie a fişierului de ieşire mesajul nu exista
SI CODUL MEU CARE IMI DA MAI MULTE SOLUTII DECAT AR TREBUI
#include
using namespace std;
ifstream f("shuffle.in");
ofstream g("shuffle.out");
int p[10],v[10],x[10],n,nr;
bool valid(int i)
{ int j;
if(i==1) return 1;
if((p[x[i]]-p[x[i-1]])==1) return 0;
for(j=1;j<=i-1;j++)
if(x[i]==x[j]) return 0;
return 1;
}
void afis()
{int i; nr++;
for(i=1;i<=n;i++) g<
g<
}
int main()
{ int i;
f>>n;
for(i=1;i<=n;i++)
{ f>>v[i];
p[v[i]]=i;
}
i=1;
while(i)
{ x[i]++;
if(x[i]>n) {x[i]=0;i--;}
else
if(valid(i))
if(i==n) afis();
else i++;
}
if(nr==0) g<<"nu exista";
return 0;
}
Răspunsuri la întrebare
Răspuns de
3
Cand verifici conditia cu doua numere alaturata, verifici doar in partea dreapta, dar nu si in partea stanga. De exemplu, pt 2 3 1 4 , verifici doar daca 2 este urmat de 3, dar nu si daca 3 este urmat 2.
Deci in functia valid(int i), modifica al doilea if astfel:
if( (p[x[i]] - p[x[i-1]) == 1 || ( (p[x[i-1]] - p[x[i]]) == 1 ) return 0;
infomatrix:
asta era,multumesc frumos:))
Alte întrebări interesante
Limba română,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă