题目链接:http://poj.org/problem?id=1731
解析:
全排列的进阶问题,注意判重
使用next_permutation函数自己就不需要考虑了
当然,如果自己手写全排列,判重会消耗太多时间,这里就需要进行部分优化
代码:
<span style="font-size:14px;">#include <iostream> #include <iomanip> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define PI 3.1415926 char str[205]; pair<char, int> visit[205]; int cnt; void init(int n){ int i, j; for(i=0; i<n; ++i){ for(j=0; j<cnt&&visit[j].first!=str[i]; ++j); if(j<cnt) visit[j].second++; else{ visit[cnt].first = str[i]; visit[cnt].second = 1; cnt++; } } } void per(int k, int n){ if(k == n){ puts(str); } else{ int i; for(i=0; i<cnt; ++i){ if(visit[i].second){ str[k] = visit[i].first; visit[i].second--; per(k+1, n); visit[i].second++; } } } } int main(){ while(~scanf("%s", str)){ int len = strlen(str); sort(str, str+len); cnt = 0; init(len); per(0,len); } return 0; }</span><span style="font-size:12px;"> </span>
POJ 1731 Orders,布布扣,bubuko.com
原文地址:http://blog.csdn.net/mullerwch/article/details/38393005