NYOJ---19擅长排列的小明

擅长排列的小明

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入
第一行输入整数N(1 每组测试数据第一行两个整数 n m (1
输出
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入
2
3 1
4 2
样例输出
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
来源

[hzyqazasdf]原创

第一种方法:
#include
#include
#include
#include               //next_permutation的头文件
using namespace std;
int main()
{
    char a[10]={'1','2','3','4','5','6','7','8','9','\0'};
    char b[10],c[10];
    int test,n,m;
    cin>>test;
    while(test--)
    {
        cin>>n>>m;
        strcpy(b,a);
        b[m]='\0';                       //因为是m位所以输出m个
        printf("%s\n",b);               //把第一个数输出例如123
        while(next_permutation(a,a+n))  //按照字典树排序
        {
            strcpy(c,a);                //把前m个拷贝在一个c数组里面
            c[m]='\0';
            if(strcmp(b,c))             //与前面输出的进行比较如果不相等就输出
            {
                strcpy(b,c);            //更新b数组
                b[m]='\0';
                printf("%s\n",b);
            }
        }
    }
    return 0;
}

第二种方法:

#include
#include
#include
using namespace std;
int a[10];
int vis[10];   //标记数组
int n,m;
void dfs(int pos)
{
    if(pos==m)  //当数组的位数为m时,就输出,也是递归结束的一个标志
    {
        for(int i=0;i>test;
    while(test--)
    {
        cin>>n>>m;
        memset(vis,0,sizeof(vis));
        dfs(0);


    }
    return 0;
}




你可能感兴趣的:(搜索)