code-neon

C++ ile Permütasyon Bulma

Kullanıcının girdiği sayı dizisinin tüm olası permütasyonlarını bulan C++ programı.

#include < iostream > 

#include < vector >   

void GeneratePermutations(const std::vector < int > & numbers,
 std::vector < int > & currentPerm, std::vector < bool > & used,
 std::vector < std::vector < int >> & permutations);

std::vector < std::vector < int >> FindPermutations(const std::vector < int > & numbers)
{
    std::vector> permutations; 
    std::vector < int >  currentPerm; 
    std::vector used(numbers.size(), false); 
    GeneratePermutations(numbers, currentPerm, used, permutations); 
    return permutations; 
}

void GeneratePermutations(const std::vector < int > & numbers,
 std::vector < int > & currentPerm, std::vector < bool > & used, 
std::vector < std::vector < int >> & permutations)
{
    if (currentPerm.size() == numbers.size())
    {
        permutations.push_back(currentPerm);
        return;
    }
    for (size_t i = 0; i < numbers.size(); i++)
    {
        if (!used[i])
        {
            used[i] = true; 
            currentPerm.push_back(numbers[i]); 
            GeneratePermutations(numbers, currentPerm, used, permutations); 
            currentPerm.pop_back(); 
            used[i] = false; 
        }
    }
}
int main()
{
    std::cout << "Sayilari virgulle ayirarak girin: ";
    std::string input;
    
    std::getline(std::cin, input);
    
    std::vector < int >  numbers;
    
    size_t pos = 0;
    while ((pos = input.find(',')) != std::string::npos)
    {
        numbers.push_back(std::stoi(input.substr(0, pos))); 
        input.erase(0, pos + 1); 
    }
    numbers.push_back(std::stoi(input)); 
    
    std::vector < std::vector < int >> permutations = FindPermutations(numbers); 
    
    std::cout << "Tum permutasyonlar:" << std::endl;
    for (const auto& perm : permutations)
    {
        for (size_t i = 0; i < perm.size(); i++)
        {
            std::cout << perm[i];
            if (i != perm.size() - 1)
                std::cout << ", ";
        }
        std::cout << std::endl;
    }
    
    return 0; 
}

Giriş/Çıkış işlemleri için gerekli kütüphane

#include < iostream > 

Vektör (vector) kullanacağız

#include < vector >   

C++ ile Permütasyonları bulan yardımcı fonksiyon

void GeneratePermutations(const std::vector < int > & numbers,
 std::vector < int > & currentPerm, std::vector < bool > & used,
 std::vector < std::vector < int >> & permutations);

C++ ile Sayıların tüm permütasyonlarını bulan fonksiyon

std::vector < std::vector < int >> FindPermutations(const std::vector < int > & numbers)
{
    std::vector> permutations; // Tüm permütasyonları tutacak bir vektör oluşturulur
    std::vector < int >  currentPerm; // Geçerli permütasyonu tutacak bir vektör oluşturulur
    std::vector used(numbers.size(), false); // Kullanılan sayıları takip etmek için bir vektör oluşturulur
    GeneratePermutations(numbers, currentPerm, used, permutations); // Permütasyonları oluşturan fonksiyon çağrılır
    return permutations; // Bulunan permütasyonları geri döndürür
}

C++ ile Permütasyonları bulan yardımcı fonksiyon (recursive)

void GeneratePermutations(const std::vector < int > & numbers,
 std::vector < int > & currentPerm, std::vector < bool > & used, 
std::vector < std::vector < int >> & permutations)
{
    // Eğer geçerli permütasyon uzunluğu, sayılar dizisinin uzunluğuna eşitse, bu bir permütasyondur ve vektöre eklenir
    if (currentPerm.size() == numbers.size())
    {
        permutations.push_back(currentPerm);
        return;
    }
    // Sayıları teker teker kullanarak permütasyonları oluşturur
    for (size_t i = 0; i < numbers.size(); i++)
    {
        if (!used[i])
        {
            used[i] = true; // Sayı kullanıldı olarak işaretlenir
            currentPerm.push_back(numbers[i]); // Geçerli permütasyona sayı eklenir
            GeneratePermutations(numbers, currentPerm, used, permutations); // Rekürsif olarak diğer permütasyonları oluşturmak için fonksiyon tekrar çağrılır
            currentPerm.pop_back(); // Fonksiyondan döndükten sonra, eklenen sayı geri çıkarılır (backtracking)
            used[i] = false; // Sayı kullanılmadı olarak işaretlenir (backtracking)
        }
    }
}

C++ ile Kullanıcıdan sayıları virgülle ayırarak girmesi istenir

    std::cout << "Sayilari virgulle ayirarak girin: ";
    std::string input;

Tüm satırı metin olarak alır

    std::getline(std::cin, input);

Sayıları tutacak bir vektör oluşturulur

    std::vector < int >  numbers;

Girdiyi virgüllere göre ayırıp vektöre ekler

    size_t pos = 0;
    while ((pos = input.find(',')) != std::string::npos)
    {
        numbers.push_back(std::stoi(input.substr(0, pos))); // Sayıyı vektöre ekler
        input.erase(0, pos + 1); // Sayıdan sonraki virgülü siler
    }
    numbers.push_back(std::stoi(input)); // Kalan son sayıyı vektöre ekler

C++ ile Sayıların permütasyonlarını hesaplar

    std::vector < std::vector < int >> permutations = FindPermutations(numbers); 

C++ ile Her bir permütasyonu ekrana yazdırır

    std::cout << "Tum permutasyonlar:" << std::endl;
    for (const auto& perm : permutations)
    {
        for (size_t i = 0; i < perm.size(); i++)
        {
            std::cout << perm[i];
            if (i != perm.size() - 1)
                std::cout << ", ";
        }
        std::cout << std::endl;
    }

C++ ile Programın başarıyla sonlandığını belirtir

    return 0;