排列

<span style="font-family: Arial, Helvetica, sans-serif;"><img src="https://img-blog.csdn.net/20160326200651704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
<span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span>
int a[10];
int book[10];
void dfs(int step)
{
    int i;
    if(step==4)//表示前 3 个框框已经放好
    {
        for(i=1;i<=3;i++)
        {
            printf("%d",a[i]);
        }
        printf("\n");
        return ;//返回的是最近一次调用dfs;调用的是dfs(3)然后执行book[i]=0;
    }
    else
    {
        for(i=1;i<=3;i++)
        {
            if(book[i]==0)
            {
                a[step]=i;
                book[i]=1;//i已经被放置
                dfs(step+1);//当前放置好后放第n+1个
                book[i]=0;//把i退回
            }
        }
    }
}
int main()
{
    dfs(1);
    return 0;
}book[4]用来标记数字i是否被使用过
step表示当前选择第step个框框来放置数字
a[step]=i表示第step个框框中放置的数字为i
一共3个数放置在a[4]中(下标从1开始)
1 2 3 放好后  return  把3收回发现只有3可选   继续退回 得到 2 即变成 1 3 2<pre name="code" class="objc">#include<stdio.h>
int a[10],book[10];
int n;
int b[10];
void dfs(int step)
{
    int i;
    if(step==n+1)//如果a【i-n】所有数都已经放好
    {

        for(i=1;i<=n;i++)
        {
            printf("%d  ",b[i]);
        }
        printf("\n");
        return ;
    }
    for(i=1;i<=n;i++)//b中可防止a【1-n】的所有数
    {
        if(book[i]==0)
        {
            b[step]=a[i];
            book[i]=1;//a【i】被使用
            dfs(step+1);//继续处理下一个数
            book[i]=0;
        }

    }
}
int main()//输入N个数的排列,由上变形
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    dfs(1);//从第一个开始
    return 0;
}

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值