2011-12-03 2 views
2

사용자가 입력 한 4 자의 문자열을 스크램블하는 프로그램을 작성해야합니다. (예제 TEST는 tset, ttse 등과 같이 뒤죽박죽이 될 수 있습니다.) 잘 작동하는 프로그램이 있지만 4 요소 char 배열로 제한되어 있습니다. 그리고 그것을 만들 수있는 방법이 있는지 알고 싶습니다. 미리 결정된 크기를 가져야합니다.셔플 링 문자열

//4 letter word scrambler (ex. test tets tset...) 
int counter=0; 
int main(int argc, char* argv[]) 
{ 
    char str[4]; 
    cout << "Please enter a word: "; //ask for input 
    cin >> str; 
    counter+=1; // set counter to 1 
    cout << counter << " " << str << endl; 
    for (int i=0;i<3;i++){// iteration through one full loop in array 
     swap(str[i], str[i+1]); //swap two elements as iterates through array 
     counter+=1;//add 1 to counter each time 
     cout <<counter<<" "<< str << endl; 
    } 
    for (int i=0;i<3;i++){ 
     swap(str[i], str[i+1]); 
     counter+=1; 
     cout << counter<< " " << str << endl; 
    } 
    for (int i=0;i<3;i++){ 
      swap(str[i], str[i+1]); 
     counter+=1; 
     cout << counter << " " << str << endl; 
    } 
    for (int i=0;i<2;i++){ 
      swap(str[i], str[i+1]); 
     counter+=1; 
     cout << counter << " " << str << endl; 
    } 

    system("PAUSE"); 
    return 0; 
} 
+0

그냥 할 간단한 [피셔 - 예이츠 (HTTP ://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) shuffle. 나는 C++을 사용하지 않으므로, 이미 이런 일을 할 수있는 무언가가있을 것입니다. 그러나 위키 기사는 꽤 좋으며 단순한 알고리즘입니다. shuffle이 * 전체 * 배열을 통해 어떻게 실행되는지 주목하십시오 (이것은 어떤 크기의 콜렉션으로도 확장 가능합니다). 이 구현을 사용하여 "현재 위치에서 출력"할 수 있습니다 (셔플 된 배열 결과를 저장할 필요가 없습니다). –

+1

당신은 모든 순열을 찾거나 그것이 무작위 적이기를 원합니 까? – Dani

+0

초기 솔루션은 어떤 일이든 정확하게 12 가지 솔루션을 제공하므로 많은 경우에 잘못되었다고 생각합니다. 다르게 배치 된 동등한 문자를 구별하고 싶습니까? 그래서, 당신은 반복의 유무에 관계없이 순열을 원합니까? _ (** TTTT **에 대한 결과는 ** 4 ** ** ** 1 **입니까?) _ – ch0kee

답변

9

을 한 번 문자열을 셔플하려면 :

string str; 
cout << "Please enter a word: "; //ask for input 
cin >> str; 
counter+=1; // set counter to 1 
cout << counter << " " << str << endl; 
for (int i=0;i<str.size();i++){ 
    // iteration through one full loop in array 

그리고 체크 아웃 문자열을 셔플 수있는 더 좋은 방법에 대한

단어의 모든 문자 순열을 인쇄하십시오. 둘 다 C++ 표준 라이브러리를 사용하여 상당히 간단합니다.

코드의 첫 번째 비트는 하나의 랜덤 셔플을 수행합니다

#include <algorithm> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str; 
    cout << "Please enter a word: "; //ask for input 
    cin >> str; 
    random_shuffle(str.begin(), str.end()); 
    cout << str << '\n'; 
} 

프린트 물을 문자열의 모든 순열을 다음

#include <algorithm> 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str; 
    cout << "Please enter a word: "; //ask for input 
    cin >> str; 
    sort(str.begin(), str.end()); 
    do { 
     cout << str << '\n'; 
    } while (next_permutation(str.begin(), str.end())); 
} 
0

문자 0 -> n-1에서 문자열을 통해 길이 N.
반복 처리의 문자열을 스크램블 할 수있는 쉬운 방법이있다.
각 반복마다 두 개의 임의 인덱스 i,j (random(n) 통해)을 선택하고 두 인덱스를 서로 바꿉니다. 균일하게 랜덤하게 스크램블된다는 것을 증명할 수 있습니다.

+0

srand() 및 rand()를 사용합니까? 그것들은 제가 아는 유일한 무작위 함수입니다. –

0

char [4] 대신 std :: string을 사용할 수 있습니다. (문자열은 항상 char []보다 더 좋습니다). 코드는 다음과 같다 : 나 잘 모르겠어요

std::next_permutation