dfs简单题目

1、桐桐的全排列(可在 http://acm.upc.edu.cn/problem.php?id=2355(中国石油acm网) 提交)

Description
今天,桐桐的老师布置了一道数学作业,要求列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字
序列中不允许出现重复的数字。因为排列数很多,桐桐害怕写漏了,所以她决定用计算机编程来解决。
Input

只有一个整数n(1≤n≤9)。

Output

按字典序输出由1~n组成的所有不重复的数字序列,每行一个序列,每个数字之间有一个空格。

Sample Input

3
Sample Output

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

第一次正式学习dfs,这个题很简单,主要需要掌握结束条件,与dfs中for循环的应用。

#include 
#include 

int a[1000], visit[1000], n;
int cunchu[10];

void dfs(int k)
{
    if (k == n){                         //判断结束条件
        for (int i = 0; i < k - 1; i++)  
            printf("%d ", cunchu[i]);
        printf("%d\n", cunchu[k -1]);
        return;
    }
    for (int i = 0; i < n; i++){
        if (visit[i] == 0){
            visit[i] = 1;               //标记是否被访问
            cunchu[k] = a[i];           //存储数字
            dfs(k + 1);                 //访问下一个数字
            visit[i] = 0;               //回溯
        }
    }
    return;
}

int main(void)
{
    scanf("%d", &n);
    for (int i = 0; i < n; i++){
        a[i] = i + 1;              //赋值
    }
    dfs(0);
    return 0;
}

你可能感兴趣的:(dfs)