题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=19
题目解析:先生成排列数,然后进行深搜。
代码如下:
01.
#include<stdio.h>
02.
//深度优先搜索
03.
int
vis[11]={0};
//存储走过标记
04.
int
b[11];
//存储走过的数字
05.
int
n,m;
//全局数字
06.
07.
void
dfs(
int
c)
//c用来记录用来排序的个数
08.
{
09.
if
(c == m)
//当个数满足选择的要求个数时就输出
10.
{
11.
for
(
int
i=0;i<m;i++)
12.
printf
(
"%d"
,b[i]);
13.
printf
(
"\n"
);
14.
}
15.
else
16.
{
17.
for
(
int
i=1;i<=n;i++)
//从第一个开始找..
18.
{
19.
if
(!vis[i])
//找到没有用过的
20.
{
21.
vis[i]=!vis[i];
//标记为用过的
22.
b[c]=i;
//并且把这个数存入
23.
dfs(c+1);
//再从这里开始进入下一个数字的搜索
24.
vis[i]=!vis[i];
//一轮搜索完毕把标记用过的标记回没用过的,再返回for从下一个i开始找
25.
}
26.
}
27.
}
28.
}
29.
30.
int
main()
31.
{
32.
int
N;
33.
scanf
(
"%d"
,&N);
34.
while
(N--)
35.
{
36.
scanf
(
"%d%d"
,&n,&m);
37.
dfs(0);
38.
}
39.
return
0;
40.
}