2015-06-21 41 views
0

這是一個置換代碼,但它不會打印所有可能的排列。只打印輸入。這段代碼有什麼問題?C代碼排列

#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); 
} 

樣品輸入

ab 
ba 

ab 

樣本輸出

ab 

,而不是我的朋友認爲只有一條線是這裏的一些錯誤。但我無法弄清楚什麼線是我缺乏

+0

你需要在'permutations();'後面恢復'bitmask'。 – BLUEPIXY

+0

或者只是將其設置爲'permutations'。 – Lynn

+0

@Mauris:使它對'permutations'本地不起作用,但是您可以將它作爲'permutations'的參數並傳遞修改後的值'bitmask | (1 << i)'遞歸時。 – chqrlie

回答

0

您可以修復你的代碼這樣的錯誤的一個或線路:

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

但它會更好不要依賴於全球變量。

考慮到固定的緩衝區大小,main中的內存分配也是不必要的。

這裏是沒有內存分配的版本,而不是全局變量:

#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; 
} 

還要注意%.*sprintf轉換說明僅從running打印第一running_count字符,以及%29sscanf符,以防止緩衝區溢出。

+0

很好的解釋。我發現你的方式更好。謝謝 :) – user2530773