Rezolvare completă PbInfo #1327 SirPIE

Cerinţa

Se citeşte un număr natural nenul n, apoi n numere naturale distincte. Să se afişeze, în ordine lexicografică, șirurile din cele n valori cu proprietatea că oricare două valori învecinate sunt prime între ele.

Date de intrare

Fişierul de intrare sirpie.in conţine pe prima linie numărul n, iar pe a doua linie n numere naturale.

Date de ieşire

Fişierul de ieşire sirpie.out va conţine pe fiecare linie elementele unei șir, separate prin câte un spaţiu.

Restricţii şi precizări

  • 1 ≤ n < 10
  • cele n numere de pe a doua linie a fişierului de intrare sunt mai mici decât 10000

Exemplu

sirpie.in

4
8 6 7 9

sirpie.out

6 7 8 9 
6 7 9 8 
8 9 7 6 
9 8 7 6 

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema SirPIE:

#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("sirpie.in");
ofstream fout("sirpie.out");

int n, x[20],v[20];

int cmmdc(int a, int b)
{
    while(b != 0)
    {
        int r = a % b;
        a = b;
        b = r;
    }
    return a;
}

void Afisare()
{
    for (int i = 1 ; i <= n ; i ++)
        fout << v[x[i]] << " ";
    fout << endl;
}

bool OK(int k)
{
    for(int i = 1; i < k ; i ++)
        if(x[i] == x[k])
            return false;
    if(k > 1)
        if(cmmdc(v[x[k]], v[x[k-1]]) != 1)
            return false;
    return true;
}

void back(int k)
{
    for(int i =1 ; i <= n ; i ++)
    {
        x[k] = i;
        if(OK(k))
            if(k == n)
                Afisare();
            else
                back(k+1);
    }
}

int main()
{
    fin >> n;
    for (int i = 1 ; i <= n ; i ++)
        fin >> v[i];
    for(int i = 1 ; i < n ; i ++)
        for(int j = i + 1 ; j <= n ; j ++)
            if(v[i] > v[j])
            {
                int aux = v[i];
                v[i] = v[j];
                v[j] = aux;
            }
    back(1);
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1327 SirPIE

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1327 SirPIE de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!