POJ 上几个关于排列的题目

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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值