首页 > 代码库 > 【字母全排列】 poj 1256
【字母全排列】 poj 1256
深搜 注意与STL模版的去重函数唯一的区别就是有去重。
#include <iostream>#include <cstdio>#include <string.h>#include <algorithm>using namespace std;int len;char ch[15],ss[15];int visted[15];bool cmp(char a,char b){ double t1=a,t2=b; if(a>=‘A‘&&a<=‘Z‘) t1+=31.5; //神来之笔,对于cmp的神级处理 if(t2>=‘A‘&&t2<=‘Z‘) t2+=31.5; return t1<t2;}void dfs(int x){ if(x==len) { for(int i=0;i<len;++i) printf("%c",ch[i]); printf("\n"); } else { for(int i=0;i<len;i++) //以任意顺序开头 { if(!visted[i]) { ch[x]=ss[i]; visted[i]=1; dfs(x+1); visted[i]=0; //另一进程需要更新dfs之前的值 while(i+1<len&&ss[i+1]==ss[i])i++; //去重 } } }}int main(){ //freopen("in.txt","r",stdin); int cas; scanf("%d",&cas); while(cas--) { memset(visted,0,sizeof(visted)); scanf("%s",ss); len=strlen(ss); sort(ss,ss+len,cmp); dfs(0); } return 0;}
网上看到的一段代码:
用的是STL的库函数next_permutation全排列
#include<cstdio>#include<iostream>#include<algorithm>#include<string>using namespace std;bool cmp(char a,char b){if(tolower(a)==tolower(b))return a<b;elsereturn tolower(a)<tolower(b);}int main(){ int t; cin>>t; while(t--) { string str; cin>>str; sort(str.begin(),str.end(),cmp); do { cout<<str<<endl; } while(next_permutation(str.begin(),str.end(),cmp)); } return 0;}
【字母全排列】 poj 1256
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。