Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- // Helper function to recursively build permutations with alternating parity
- void backtrack(std::vector<int>& perm, std::vector<int>& odds, std::vector<int>& evens, std::vector<std::vector<int>>& results, bool expect_odd) {
- if (perm.size() == odds.size() + evens.size()) {
- results.push_back(perm);
- return;
- }
- if (expect_odd) {
- for (size_t i = 0; i < odds.size(); ++i) {
- if (odds[i] != -1) {
- int num = odds[i];
- perm.push_back(num);
- odds[i] = -1; // Mark as used
- backtrack(perm, odds, evens, results, !expect_odd);
- perm.pop_back();
- odds[i] = num; // Unmark
- }
- }
- } else {
- for (size_t i = 0; i < evens.size(); ++i) {
- if (evens[i] != -1) {
- int num = evens[i];
- perm.push_back(num);
- evens[i] = -1; // Mark as used
- backtrack(perm, odds, evens, results, !expect_odd);
- perm.pop_back();
- evens[i] = num; // Unmark
- }
- }
- }
- }
- // Main function to initialize and call the recursive generation
- void find_alternating_parity_permutations(int n) {
- std::vector<int> odds, evens;
- for (int i = 1; i <= n; ++i) {
- if (i % 2 == 0) {
- evens.push_back(i);
- } else {
- odds.push_back(i);
- }
- }
- std::vector<int> perm;
- std::vector<std::vector<int>> results;
- backtrack(perm, odds, evens, results, true);
- backtrack(perm, odds, evens, results, false);
- std::sort(results.begin(), results.end());
- // Print results
- for (const auto& p : results) {
- for (const auto& num : p) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
- }
- return results;
- }
- int main() {
- int n;
- std::cin >> n;
- find_alternating_parity_permutations(n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment