51nod 1384全排列

xiaoxiao2021-02-28  56

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”, 输出为:

1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211 Input 输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字) Output 输出S所包含的字符组成的所有排列 Input示例 1312 Output示例 1123 1132 1213 1231 1312 1321 2113 2131 2311 3112 3121 3211 看到全排列 想起曾经用过的next-permutation()函数 这是个全排列函数 此题还可用dfs写(我还不熟悉此方法) STL解法(已ac)

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { char a[10]; cin >> a; int len = strlen(a); sort(a, a + len); do { puts(a); } while (next_permutation(a, a + len)); return 0; }

dfs解法(已ac)

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; /* int main() { char a[10]; cin >> a; int len = strlen(a); sort(a, a + len); do { puts(a); } while (next_permutation(a, a + len)); return 0; } */ char a[10]; //原字符串数组 int b[10]; //字符串改为数字后用排序函数 int c[10]; //判断数组 int d[10]; //得到的全排列数组 int len; void dfs(int s) { int i; if (s == len) { for ( i = 0; i < len; i++) cout << d[i]; cout << endl; return; } for ( i = 0; i < len; i++) { if (!c[i]) { c[i] = 1; //该数字未作为第一个排序 d[s] = b[i]; dfs(s + 1); //找下一个数字 c[i] = 0; //该数字已使用完毕 while (i -1 < len&&b[i] == b[i + 1]) //排除相同数字的情况 i++; } } } int main() { cin >> a; len = strlen(a); for (int j = 0; j < len; j++) b[j] = a[j] - '0'; sort(b, b + len);//升序排序 dfs(0); return 0; }
转载请注明原文地址: https://www.6miu.com/read-2626566.html

最新回复(0)