标签:style blog http color io os ar for strong
题目链接:http://poj.org/problem?id=1256
思路:
该题为含有重复元素的全排列问题;由于题目中字符长度较小,采用暴力法解决。
代码如下:
#include <iostream> #include <algorithm> using namespace std; const int MAX_N = 20; char P[MAX_N], A[MAX_N]; char * SortAlp( char P[], int n ) { int Low[MAX_N], Upper[MAX_N]; int LowLen, UpperLen; LowLen = UpperLen = 0; for ( int i = 0; i < n; ++i ) { if ( ‘A‘ <= P[i] && P[i] <= ‘Z‘ ) Upper[UpperLen++] = P[i]; else Low[LowLen++] = P[i]; } sort( Low, Low + LowLen ); sort( Upper, Upper + UpperLen ); int Index_L, Index_U; Index_L = Index_U = 0; for ( int j = 0; j < n; ++j ) { if (Upper[Index_U] - ‘A‘ + ‘a‘ <= Low[Index_L] && Index_U < UpperLen) P[j] = Upper[Index_U++]; else P[j] = Low[Index_L++]; } return P; } void PrintPermutation( int n, char P[], char A[], int cur ) { int i, j; if ( cur == n ) { for ( i = 0; i < n; ++i ) printf( "%c", A[i] ); printf("\n"); } else { for ( i = 0; i < n; ++i ) { if ( !i || P[i] != P[i-1] ) { int c1 = 0, c2 = 0; for ( j = 0; j < cur; ++j ) if ( A[j] == P[i] ) c1++; for ( j = 0; j < n; ++j ) if ( P[i] == P[j] ) c2++; if ( c1 < c2 ) { A[cur] = P[i]; PrintPermutation( n, P, A, cur + 1 ); } } } } } int main() { int n; char P[MAX_N]; cin >> n; for ( int i = 0; i < n; ++i ) { cin >> P; SortAlp( P, strlen(P) ); PrintPermutation( strlen(P), P, A, 0 ); } return 0; }
标签:style blog http color io os ar for strong
原文地址:http://www.cnblogs.com/tallisHe/p/4020017.html