http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1398
//字典序和全排列 学习。
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 256
char gch_Buf[MAX_LENGTH] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
int judge[MAX_LENGTH];
int gi_CaseCount;
void sort(char *head, int size) {
int i, j, tmp;
for (i = 0; i < size; i++)
{
int k = i;
for (j = i + 1; j < size; j++)
{
if (judge[ head[k] ] > judge[ head[j] ])
{
k = j;
}
}
if (k != i) {
tmp = head[k];
head[k] = head[i];
head[i] = tmp;
}
}
}
int getNext(char *head, int size) {
int right = -1, left = -1, i;
char tmp;
for (i = size - 2; i >= 0; i--) {
if (judge[ head[i] ] < judge[ head[i + 1] ]) {
right = i;
break;
}
}
if (right < 0) {
return -1;
}
for (i = size - 1; i > right; i--) {
if (judge[ head[i] ] > judge[ head[right] ]) {
left = i;
break;
}
}
/* exchange*/
tmp = head[right];
head[right] = head[left];
head[left] = tmp;
/* reverse*/
left = right + 1;
right = size - 1;
while (left <= right) {
tmp = head[right];
head[right] = head[left];
head[left] = tmp;
left++;
right--;
}
return 1;
}
int main () {
int i, j;
for (i = 0; gch_Buf[i] != '\0' && i < MAX_LENGTH ; i++) {
judge[gch_Buf[i]] = i;
}
while (EOF != scanf("%d", &gi_CaseCount) && gi_CaseCount >= 1) {
for (i = 0; i < gi_CaseCount; i++)
{
scanf("%s", gch_Buf);
j = strlen(gch_Buf);
sort(gch_Buf, j);
printf("%s\n", gch_Buf);
while (getNext(gch_Buf, j) == 1) {
printf("%s\n", gch_Buf);
}
}
}
return 0;
}