1 .http://poj.org/problem?id=1731http://poj.org/problem?id=1731 POJ 1731 Orders
关于子集和全排列 详情 http://blog.csdn.net/luchenqun/article/details/6401954
<span style="font-size:18px;">#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string str;
while(cin>>str)
{
sort(str.begin(),str.end());
do
{
cout<<str<<endl;
}while(next_permutation(str.begin(),str.end()));
}
return 0;
}
</span>
2 。http://poj.org/problem?id=1256 POJ 1256 Anagram
这个稍微麻烦一点儿
#include<iostream>
#include<string>
#include<algorithm>
#include<cctype>
using namespace std;
bool cmp(char a ,char b )
{
if(tolower(a)==tolower(b)) //如果两个字母不区分大小写是同一个字母,常规比较即可
return a<b;
else
return tolower(a)<tolower(b);//如果是不同的字母,把它俩转换到同一ASCII区间比较。这是根据题意的 排序要求。
}
int main()
{
int t;
string str;
cin>>t;
while(t--)
{
cin>>str;
sort(str.begin(),str.end(),cmp);
do
{
cout<<str<<endl;
}while(next_permutation(str.begin(),str.end(),cmp));
}
return 0;
}
3 http://poj.org/problem?id=1833 POJ 1833 排列
这个题目让我认识到更多next_permutation函数特性,虽然不知道现在还不知道它原理,现在只需要知道stl接口就可以了~
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
int t,n,k;
int cnt[2000];
scanf("%d",&t);
while(t--)
{
int count=0;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
scanf("%d",&cnt[i]);
while(k--)
next_permutation(cnt,cnt+n);
for(int j=0;j<n;j++)
printf("%d%c",cnt[j],j==n-1?'\n':' ');
}
return 0;
}
或着:
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
int t,n,k;
int cnt[2000];
scanf("%d",&t);
int flag;
while(t--)
{
int count=0;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
scanf("%d",&cnt[i]);
do
{
if(count==k)
{
for(int j=0; j<n; j++)
printf("%d%c",cnt[j],j==n-1?'\n':' ');
break;
}
count++;
flag=next_permutation(cnt,cnt+n);
}
while(!flag||flag);
}
}
Poj 1318 Word Amalgamation http://write.blog.csdn.net/postedit
感觉上几个题做完这个题就很简单了 感觉网上答案都没我做的简单
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<string>cnt;
string dict;
while(cin>>dict)
{
if(dict=="XXXXXX")
break;
cnt.push_back(dict);
}
string buf;
while(cin>>buf)
{
if(buf=="XXXXXX")
break;
sort(buf.begin(),buf.end());
int ok=0;
do
{
for(vector<string>::iterator it=cnt.begin(); it!=cnt.end(); it++)
{
if(*it==buf)
{
ok=1;
cout<<*it<<endl;
}
}
}
while(next_permutation(buf.begin(),buf.end()));
if(!ok)
cout<<"NOT A VALID WORD"<<endl;
cout<<"******"<<endl;
}
return 0;
}
另外 发现一个更巧妙的版本
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define abs(a) ((a)>0?(a):-(a))
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=105;
int n,m;
char a[N][8];
char t[8];
bool vis[8];
int main()
{
while(scanf("%s",a[++n]),strcmp(a[n],"XXXXXX"));
n--;
while(scanf("%s",t),strcmp(t,"XXXXXX"))
{
vector<string> vec;
int len=strlen(t);
for(int i=1;i<=n;i++)//遍历数组a寻找匹配对象
{
if(strlen(a[i])==len)//条件1:长度相等
{
memset(vis,0,sizeof(vis));
int j=0;
while(j<len)//条件2:遍历每个字符都可以在目标字符串里面的不同位置找到。
{
bool flag=false;
for(int k=0;k<len;k++)
{
if(!vis[k]&&a[i][j]==t[k])
{
vis[k]=true;
j++;
flag=true;//表示该字符已匹配
break;
}
}
if(!flag)
{
break;
}
}
if(j==len)
{
vec.push_back(a[i]);
}
}
}
if(vec.empty())
printf("NOT A VALID WORD\n");
else
{
if(vec.size()>1)
sort(vec.begin(),vec.end());
for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++)
cout<<*iter<<endl;
}
printf("******\n");
}
return 0;
}