首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

善于排列的小明 DFS()和 STL两种方法

2013-01-28 
擅长排列的小明DFS()和 STL两种方法擅长排列的小明65535 KB难度:4描述 小明十分聪明,而且十分擅长排列计算

擅长排列的小明 DFS()和 STL两种方法
擅长排列的小明65535 KB难度:4

描述 小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)输出在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例样例输入
23 14 2
样例输出
123121314212324313234414243
DFS:

#include<cstdio>#include<cstring>using namespace std;int n,m;int a[21];int su[101];

int visit[200];void DFS(int c){    if(c==m)    {        for(int i=0; i<m; i++)            printf("%d",a[i]);        //printf("%d",a[m-1]);        printf("\n");    }    else    {        for(int i=0; i<n; i++)            if(!visit[i])//  如果  次数 与前一个数相加为素数 且没被拜访过 则  赋值            {                a[c]=i+1;                visit[i]=1;//  标记                DFS(c+1);//  继续查找下一行                visit[i]=0;//回溯            }    }}

int main(){    int test;    scanf("%d",&test);    while(test--)    {        scanf("%d%d",&n,&m);        memset(visit,0,sizeof(visit));        DFS(0);    }    return 0;}

 

STL:

#include <iostream>#include <algorithm>#include <string>using namespace std;

int main(){    int i,j,k,T;    cin>>T;    while(T--)    {        int x,y;        string s1,s2;        cin>>x>>y;        for(i=1; i<=x; i++)        {            s1 += '0'+i;        }        s2=s1.substr(0,y);        cout<<s2<<endl;        while(next_permutation(s1.begin(),s1.end()))        {            if(s2!=s1.substr(0,y))            {                s2=s1.substr(0,y);                cout<<s2<<endl;            }        }    }    return 0;}

热点排行