码迷,mamicode.com
首页 > 其他好文 > 详细

next_permutation用法和一个不成功的案例~(>_<)

时间:2015-08-03 22:28:17      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

 

几种常见用法:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
 char d[100];
 cin>>d;
 sort(d,d+strlen(d));
 char *first=d;
 char *last=d+strlen(d);
 do{
  cout<<d<<endl;
 }while(next_permutation(first,last));
 return 0;
}

////////////////////////////////////////////

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
 char d[100];
 cin>>d;
 sort(d,d+strlen(d));
 char *first=d;
 char *last=d+strlen(d);
 do{
  cout<<d<<endl;
 }while(next_permutation(first,last));
 return 0;
}

//////////////////////////////////////////

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
 string dog;
 while(cin>>dog&&dog!="@")
 {
  sort(dog.begin(),dog.end());
  while(next_permutation(dog.begin(),dog.end()))
  {
   cout<<dog<<endl;
  }
 }
}

///////////////////////////////////////

一个失败的案例:(POJ 1009)

题目描述

小翔同学的宿舍WIFI添加了密码,密码每天都会变更。而小翔每天都会给蹭网的同学们提供密码提示。现在请你根据密码提示,编写程序破译密码。 已知密码提示给出了n个整数 a1,a2,…,an,以及一个整数 t(t小于n)。从这n个整数中任选t个相加,可分别得到一系列的和。例如当 n=4,t=3,4 个整数分别为 3,7,12,19 时,可得全部组合的和分别为:    

   3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。 而和为素数的个数即为小翔宿舍WIFI的密码。

例如上例,只有一种的和为素数:3+7+19=29,于是密码即为1。

输入

n , t (1<=n<=20,t<n) a1,a2,…,an (1<=ai<=5000000)

样例输入

4 3 3 7 12 19

样例输出

1
技术分享
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<math.h>

using namespace std;
long d[25],*head;
int i,n,t,sum=0,mark=0,Q;

int fun(int ns)
{
    int j,m;
    m=(int)sqrt(ns);
    for(j=2;j<=m;j++)
    {
        if(!(ns%j))
        {return 0;}
    }
    return 1;
}

int permutation()
{
    if(Q<t){cout<<n<<Q<<t<<"$"; return mark;}
    do
    {
        for(i=0;i<t;i++)
        {
            sum=sum+d[i];
            cout<<d[i]<<"*";
        }
        if(fun(sum)==1)
        {
            mark++;
        }
        sum=0;
    }while(next_permutation(d,d+Q));
    Q--;cout<<"!";
    permutation();
}

int main()
{
    freopen("stdin.txt","r",stdin);
    while(scanf("%d %d",&n,&t)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%ld",&d[i]);
        }
        Q=n;
        cout<<permutation()<<endl;
        mark=n=t=0;
    }
        return 0;              //相同时合并,缺少情况
}
View Code

next_permutation遇到同次相同序列会合并,用到这道题会出错,要注意用的条件,这道题用DFS即可。

 

next_permutation用法和一个不成功的案例~(>_<)

标签:

原文地址:http://www.cnblogs.com/dzzy/p/4700357.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!