题目:1005: 全排列问题
Description
输出自然数1到n所有不重复的排列,即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

思路:建立函数时传一个n用来进行计算其循环到次数,即全排已经排好的或者说还可以排的次数;
然后每次循环从1到n找,但要有一个标记数组用来标记哪一个是已经被选中了,如果没有选中说明可以继续选,选中过了的,则跳过去找其他的,每次选中的都存到一个数组中,如果之后直接输出这个数组(这个方法告诉我们了,对于输出一个序列的问题时,如果其中序列的元素不是同时得到的时候,则可以通过存入到一个数组中,然后输出数组的操作);别忘了,每次结束一个序列的输出后,再依次退出递归的时候要紧接着将上一个使用的数值给再标记为没有被选中;这样才能进行其他的;

代码:

#include<stdio.h>
#include<string.h>

void dfs(int );

int queue_number[10];
int tag[9]={0};
int n;

int main()
{
    while(scanf("%d",&n)!=EOF){
        dfs(n);
    }
    return 0;
}

void dfs(int t)
{
    if(t==0)
    {
        for(int i=0;i<n;++i){
            printf("%d",queue_number[i]);
            if(i!=n-1)  printf(" ");
            else printf("\n");
        }
        return;
    }
    for(int i=1;i<=n;++i){
        if(tag[i]==0){
            queue_number[n-t]=i;
            tag[i]=1;
            dfs(t-1);//递归是这个表示的是还可以选中的数的个数
            tag[i]=0;
        }
    }
}

haixinjiazu
1 声望0 粉丝