nyoj_366_D的小L_201403011600

 

D的小L

时间限制:4000 ms  |  内存限制:65535 KB
难度:2
 
描述
      一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗?
 
输入
第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。
样例输入
2
2
3
样例输出
12
21
123
132
213
231
312
321
来源
原创
上传者
kapop
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int s[12]={1,2,3,4,5,6,7,8,9};
 6 int main()
 7 {
 8     int T;
 9     scanf("%d",&T);
10     while(T--)
11     {
12         int i,n;
13         scanf("%d",&n);
14         do
15         {
16             for(i=0;i<n;i++)
17             printf("%d",s[i]);
18             printf("\n");
19         }while(next_permutation(s,s+n));
20     }
21     return 0;
22 }
View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 int res[12];    //存放结果 
 4 int vis[12];    //标记是否被用过
 5 int n;
 6 void output()
 7 {
 8     int i;
 9     for(i=1;i<=n;i++)
10     printf("%d",res[i]);
11     printf("\n");
12 } 
13 void dfs(int step)
14 {
15     int i;
16     if(step>n) //满足深度时输出
17     output();
18     else
19     {
20         for(i=1;i<=n;i++)
21         if(!vis[i]) //如果i没有被用过 
22         {
23             vis[i]=1;   //用过后标记为用过
24             res[step]=i;  //存入数组,待会儿输出
25             dfs(step+1);    //继续找下一位数
26             vis[i]=0;//函数返回后就以为着回到上一次的for循环,那么这次的i定将被释放(不用),那么标记为没用过 
27         }
28     }
29 }
30 int main()
31 {
32     int T;
33     scanf("%d",&T);
34     while(T--)
35     {
36         memset(vis,0,sizeof(vis));
37         scanf("%d",&n);
38         dfs(1);
39     }
40     return 0;
41 }

 

posted @ 2014-03-01 16:23  龙腾四海365  阅读(187)  评论(0编辑  收藏  举报