C-Code-Permutation


user2530773

Hier ist ein Permutationscode, der jedoch nicht alle möglichen Permutationen druckt. Nur gedruckt ist die Eingabe. Was ist los mit diesem Code?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int bitmask;
char* characters;
int characters_count;
char* running;
int running_count;
void permutations() {
    int i;
    if (running_count == characters_count) {
        printf("%s\n", running);
    } else {
        for (i=0; i<characters_count; i++) {
            if ( ((bitmask>>i)&1) == 0 ) {
                running[running_count] = characters[i];
                bitmask |= (1<<i);
                running_count = running_count + 1;
                permutations();
                running_count = running_count - 1;
            }
        }
    }
}

main() {
    int i;
    int cases;

    characters = (char*)malloc(sizeof(char)*30);
    scanf("%s", characters);
    characters_count = strlen(characters);

    running = (char*)malloc(sizeof(char)*30);
    memset(running, 0, 30);
    running_count = 0;

    permutations();

    free(characters);
    free(running);
}

Probeneingabe

ab

Beispielausgabe

ab

Anstatt von

ab
ba

Mein Freund hält hier nur eine Zeile für einen Fehler. Aber ich kann nicht herausfinden, welche Zeile die falsche ist oder welche mir fehlt

chqrlie

Sie können Ihren Code folgendermaßen korrigieren:

    bitmask |= (1<<i);
    running_count = running_count + 1;
    permutations();
    running_count = running_count - 1;
    bitmask &= ~(1<<i);

Es wäre jedoch viel besser, sich nicht auf globale Variablen zu verlassen.

Aufgrund mainder festen Puffergröße ist auch keine Speicherzuweisung erforderlich .

Hier ist eine Version ohne Speicherzuordnung, keine globalen Variablen:

#include <stdio.h>
#include <string.h>

void permutations(int bitmask,
                  const char *characters, int characters_count,
                  char *running, int running_count) {
    if (running_count == characters_count) {
        printf("%.*s\n", running_count, running);
    } else {
        for (int i = 0; i < characters_count; i++) {
            if (((bitmask >> i) & 1) == 0) {
                running[running_count] = characters[i];
                permutations(bitmask | (1 << i),
                             characters, characters_count,
                             running, running_count + 1);
            }
        }
    }
}

int main(void) {
    char characters[30];
    char running[30];

    if (scanf("%29s", characters) == 1) {
        permutations(0, characters, strlen(characters), running, 0);
    }
    return 0;
}

Beachten Sie auch, dass der %.*s printfKonvertierungsspezifizierer nur die ersten running_countZeichen druckt runningund der %29s scanfSpezifizierer, um einen Pufferüberlauf zu verhindern.

Verwandte Artikel


Permutation und Kombination in C #

Sikrigagan Bitte sagen Sie mir, wie ich Permutation und Kombination in der C # -Konsolenanwendung anwenden und Werte von N und r nehmen und Permutation und Kombination berechnen kann. Weston Ich habe es nur zum Spaß versucht, es ist tatsächlich eine kleine Her

Permutation in C++

unbekannt29 class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int> > result; vector<int> sofar; permutehelper(nums, sofar, result); return result; } void permutehelper(vect

Permutation und Kombination in C ++ finden

Shrinivas Petale Ich möchte eine Reihe von Zahlen dynamischer Länge in C ++ finden. Angenommen, ich habe 2 Gruppen von Zahlen: arr1[3] = {1, 3, 8}und arr2[4] = {2, 9}dann ist die erwartete Ausgabe: '1, 2', '1, 9', '3, 2', '3, 9', '8, 2', '8, 9'. Wenn es jetzt

Generieren der Permutation des Strings in c ++

Ninjakx Dies ist der Code, der mithilfe der Bitmaskierung eine mögliche Permutation generiert. Ich habe Probleme zu verstehen, wie es nach dieser Bedingung ausgeführt wird, wenn i = 2 , bit = 4 , mask = 7. Wann bit is 4und mask is 7so Bedingung (bit & mask) ==

Finden Sie eine versteckte Permutation eines Strings C++

Froooo Ich habe zwei Strings und wollte überprüfen, ob der zweite eine Permutation des ersten ist (und natürlich umgekehrt). Also habe ich auf cplusplus Referenz fand heraus , dass die is_permutation Funktion der Bibliothek Algorithmus mir helfen könnte. Tatsä

Permutation in JavaScript

jhone Hier ist mein Problem: Suchen Sie für einen bestimmten Satz nach Vorkommen des angegebenen Zeichensatzes. Wählen Sie gefilterte Wörter aus und generieren Sie Permutationen. (Satz und Zeichen dürfen nur Großbuchstaben enthalten.) Ausgewählte Wörter und Pe

Permutation in SQL

user5529778 Ich habe das folgende Problem und kann keine Lösung finden (auch nachdem ich viel im Internet gesucht habe). Ich habe eine Tabelle mit Projekten und den zugehörigen Mitarbeitern (ca. 100.000 Einträge): +------------+-------------+ | Project ID |

Unstable permutation

sujithra baskaran Today, I tried to solve this question: A permutation P is called unstable if it keeps changing every second based on the rule below. -Every element of the permutation is changing every second independently following a rule, i.e., after one se