首页 > 代码库 > 擅长排列的小明

擅长排列的小明

擅长排列的小明

时间限制:1000 ms  |  内存限制: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

题解:没事水的一道题,编译错误,没有pthread的头文件。。。。

代码

#include <iostream>#include <pthread.h>#include <algorithm>#include <cstdio>#include <queue>#include <cstring>using namespace std;int ans[10];int vis[10];struct work_arg{    int n, m;    work_arg(int n, int m){        this->n = n; this->m = m;        }    work_arg(){        }};void dfs(int i, int n, int m);void *work(void* arg){    work_arg* warg = (work_arg *)arg;    int n = warg->n, m = warg->m;    memset(vis, 0, sizeof(vis));    dfs(0, n, m);}void dfs(int i, int n, int m){    if(i == m){        for(int p = 0; p < m; p++){            //if(p)printf(" ");            printf("%d", ans[p]);        }        puts(" ");        return;    }    for(int p = 1; p <= n; p++){        if(vis[p])continue;        vis[p] = 1;        ans[i] = p;        dfs(i + 1, n, m);        vis[p] = 0;    }}int main(){    pthread_t pth;    int T;    scanf("%d", &T);    while(T--){        int m, n;        scanf("%d%d", &n, &m);        work_arg arg(n, m);        pthread_create(&pth, NULL, work, (void *)&arg);        pthread_join(pth, NULL);    }    return 0;}

 

擅长排列的小明