Sve permutacije

Pitanje ili opis problema

Dobijam WA na svim primerima osim prvog, a čini mi se da je moj kod dobar, probao sam ga ručno. Ima li neko ideju o šta je problem? Vidim da već postoji topic o ovom zadatku ali tamo problem nije i dalje rešen.

#include<bits/stdc++.h>
using namespace std;

#define MAXN 100

int a[MAXN],b[MAXN];
int n;

void printaj()
{
      for(int i=0; i<n; ++i) cout<<a[i]<<" "; cout<<endl;
}
void f(int pos)
{
      if(pos==n) return printaj();
      for(int i=1; i<=n; ++i) {
            if(b[i]) continue;
            else {
                  b[i]=true;
                  a[pos]=i;
                  f(pos+1);
                  b[i]=false;
            }
      }
}

int main()
{
    cin>>n;
    f(0);
    return 0;
}

Link ka zadatku ili odgovarajućoj stranici

https://petlja.org/biblioteka/r/problemi/zbirka-napredni-nivo/sve_permutacije

Sad cu ja da probam pa cu ti javiti

1 Like

Deluje mi da je problem do zadatka.

Za sada ne vidim problem sa zadatkom. :slight_smile:
Testovi i ogranicenja su dobro podesena.

Napisao sam kod koji uporedjuje moje rezultate sa next_permutation funkcijom i nikada se ne razlikuje. Do čega bi moglo da bude?

#include<bits/stdc++.h>
using namespace std;

#define MAXN 100
#define endl '\n'
#define all(a) a.begin(),a.end()

vector<int> bb;
vector<int> a,b(MAXN);
int n;
bool ima;

void printaj()
{
//      if(ima) cout<<endl;
//      for(int i=0; i<n; ++i) {
//            if(i>0) cout<<' ';
//            cout<<a[i];
//      }
//      ima=true;
      if(a!=bb) { cout<<"FEJL"<<endl; exit(0); }
      next_permutation(all(bb));
}
void f(int pos)
{
      if(pos==n) return printaj();
      for(int i=1; i<=n; ++i) {
            if(b[i]) continue;
            else {
                  b[i]=true;
                  a[pos]=i;
                  f(pos+1);
                  b[i]=false;
            }
      }
}

int main()
{
    n=9;
    while(n--)
    {
          b.resize(n);
          bb.resize(n); fill(all(b),0);
          a.resize(n);
          for(int i=0; i<n; ++i) bb[i]=i+1;
          f(0);
    }
    return 0;
}

Gregor je imao isti problem. Sve permutacije

Ima li nekih novosti? @NenadMilutinovic

Mislim da nema problema sa ovim zadatkom. :slight_smile:

@gregor Jesi li rešio problem?

meni ovaj kod (koji bi trebao da bude perfektan) isto neće

import itertools
l =list(itertools.permutations(range(1, int(input())+1)))
for i in l:
    for j in i:
        print(j, end = " ")
    print("")

Evo koda koji se cini apsolutno tacnim jer koristi ugradjenu next_permutation funkciju. Cak sam i pazio oko stampanja novog reda i razmaka jer mozda to pravi problem, i ponovo WA. Neka ideja sta je problem?

#include<bits/stdc++.h>
using namespace std;

#define all(a) a.begin(), a.end()
#define endl '\n'
#define PB push_back
#define fast ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define raz " "
#define F first
#define ll long long
#define S second
#define w(a) cout<<#a<<" : "<<a<<endl;

int main()
{
      fast;
      bool ind=false;
      int n; cin>>n;
      vector<int> a(n);
      for(int i=0; i<n; ++i) a[i]=i+1;
      do
      {
            if(ind) cout<<endl;
            ind=true;
            for(int i=0; i<n; ++i) {
                  if(i) cout<<' ';
                  cout<<a[i];
            }
      } while(next_permutation(all(a)));
      return 0;
}

@NenadMilutinovic Ocigledno je problem u checkeru koji ne prihvata ispis koji je proizvoljan. Kada sam poslao kod koji stampa:

2 1
1 2

umesto recimo:

1 2
2 1

sto bi odstampao moj kod, prosao je drugi primer. :slight_smile:

1 Like

Provericu sa autorima :slight_smile:

1 Like

Probajte sada. :slight_smile:

ne radi i dalje

1 Like

Mozda samo da stavite u test primerima da budu permutacije poredjane leksikografski rastuce i da se to samo stavi u tekstu zadatka umesto da mogu biti poredjane u bilo kom poretku.

2 Likes

Sada je checker dodatno doradjen.
Potencijalni problem su bile beline ili visak istih.

2 Likes

Sada je ok.

1 Like