UVA 10098

来源:互联网 发布:mac重装系统无法验证 编辑:程序博客网 时间:2024/06/05 13:26

题目大意:按字典次序输出全排列,不要重复的。

解题思路:全排列,set容器。

全排列代码:

#include <iostream>#include <cstring>using namespace std;int n, vis[1005], num[1005];void dfs(int d){if (d >= n){for (int i=0; i<n; i++)printf("%d ", num[i]);printf("\n");}else{for (int i=0; i<n; i++)if (!vis[i]){vis[i] = 1;num[d] = i+1;dfs(d+1);vis[i] = 0;}}}int main(){while (scanf("%d", &n)!=EOF){memset(vis, 0, sizeof(vis));dfs(0);}return 0;} 


ac代码:

#include <iostream>#include <cstring>#include <set>using namespace std;int n, len, cnt, vis[20];char ch[20], map[20], re[20];set <string>se;set <string>::iterator it;void dfs(int n){if (n == len){re[len] = '\0';se.insert(re);return ;}else{for (int i=0; i<len; i++)if (!vis[i]){vis[i] = 1;re[n] = map[i];dfs(n+1);vis[i] = 0;}}}int main(){scanf("%d", &n);while (n--){scanf("%s", ch);len = strlen(ch);memset(vis, 0, sizeof(vis));for (int i=0; i<len; i++)map[i] = ch[i];cnt = 0;dfs(0);for (it=se.begin(); it!=se.end(); it++)cout << *it << endl;printf("\n");se.clear();}return 0;}
原创粉丝点击