标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 18307 | Accepted: 7452 |
Description
Input
Output
Sample Input
3 aAb abc acba
Sample Output
Aab Aba aAb abA bAa baA abc acb bac bca cab cba aabc aacb abac abca acab acba baac baca bcaa caab caba cbaa
Hint
So the right order of letters is ‘A‘<‘a‘<‘B‘<‘b‘<...<‘Z‘<‘z‘.
就是求出个全排列,先按要求排序,再进行搜索,这里,用的是交换的方法,就可以得出答案
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "string.h" #include "math.h" #include <algorithm> #include <vector> #include <queue> #include <iostream> using namespace std; #define N 1125 #define SCANF scanf_s char str[N]; bool isBig(char a) { if (a < 'a') return true; return false; } bool cmp(char a, char b) { if (isBig(a)== isBig(b)) { return a < b; } else { int x = isBig(a) ? a - 'A' : a - 'a'; int y = isBig(b) ? b - 'A' : b - 'a'; if (x != y) return x < y; else return isBig(a); } } void swap(int i, int j) { char temp = str[i]; str[i] = str[j]; str[j] = temp; } void print(int n) { for (int i = 0; i < n; i++) { printf("%c", str[i]); } printf("\n"); } int dfs(int k,int n) { if (k >= n){ print(n); return 0; } for (int i = k; i < n; i++) { if (i == k || str[i] != str[k]) { swap(i, k); dfs(k + 1, n); } } char temp = str[k]; for (int i = k; i < n - 1; i++) { str[i] = str[i + 1]; } str[n-1] = temp; return 0; } int main() { int n; while (SCANF("%d", &n ) != EOF) { SCANF("%s",str,N); int lenth = strlen(str); sort(str, str + lenth, cmp); //printf("%s\n", str); dfs(0, lenth); } return 0; }
标签:
原文地址:http://blog.csdn.net/mengzhengnan/article/details/45850041