Informatică, întrebare adresată de wejer30040, 8 ani în urmă

#3689 2gen
Cerința
Se n și m numere naturale. Afișați în ordine lexicografică toate șirurile de lungime m care conțin numere de la 1 la n și fiecare valoare apare de maxim două ori.

Date de intrare
Fișierul de intrare 2gen.in conține pe prima linie numerele n și m separate prin spațiu.

Date de ieșire
Fișierul de ieșire 2gen.out va conține câte o soluție pe linie. Numerele de pe aceeași linie se separă prin spații.

Restricții și precizări
1 ≤ n ≤ 6
1 ≤ m ≤ 6
Exemplu
2gen.in
4 3
2gen.out
1 1 2
1 1 3
1 1 4
1 2 1
1 2 2
1 2 3
1 2 4
1 3 1
1 3 2
1 3 3
1 3 4
1 4 1
1 4 2
1 4 3
1 4 4
2 1 1
2 1 2
2 1 3
2 1 4
2 2 1
2 2 3
2 2 4
2 3 1
2 3 2
2 3 3
2 3 4
2 4 1
2 4 2
2 4 3
2 4 4
3 1 1
3 1 2
3 1 3
3 1 4
3 2 1
3 2 2
3 2 3
3 2 4
3 3 1
3 3 2
3 3 4
3 4 1
3 4 2
3 4 3
3 4 4
4 1 1
4 1 2
4 1 3
4 1 4
4 2 1
4 2 2
4 2 3
4 2 4
4 3 1
4 3 2
4 3 3
4 3 4
4 4 1
4 4 2
4 4 3

Răspunsuri la întrebare

Răspuns de simulink
1

Răspuns:

#include <iostream>

#include <fstream>

using namespace std;

ifstream fin("2gen.in");

ofstream fout("2gen.out");

int n,m,sol[20];

int succesor(int k)

{

   if (sol[k]<n)

       {

           sol[k]++;

           return 1;}

           else return 0;

}

int valid(int k)

{int i,nr=0;

for (i=1;i<k;i++)

if (sol[k]==sol[i]) nr++;

return (nr<=1);

}

void back(int k)

{

   if(k==m+1)

   {for(int i=1;i<=m;i++) fout<<sol[i]<<" ";

   fout<<endl;}

   else

   {

       sol[k]=0;

       while (succesor(k))

       if (valid(k)) back(k+1);

   }

}

int main()

{

fin >>n>>m;

back(1);

return 0;

}

Explicație:

Alte întrebări interesante