百练2748 全排列

递归:

有的问题在解决时,可以先做一步操作,操作后的局面是和原问题形式相同但是规模变小的新问题,由新问题的答案可以推出原问题的答案,这样的问题,就可以使用递归解决。这种情况下使用递归,会不停地缩小问题的规模,直到问题缩小到某一规模后(称为满足了某个终止条件),就无法或者不必再递归缩小其规模,而是立即求出该最小问题的解,并且再往上层层推出最初原始问题的解。

递归函数不能总是没完没了地调用自身,必须存在某种条件,该条件满足时函数就不需要调用自身,而是直接返回。

----------------------------

分析排列问题:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

char s[10];
char res[10];
int len;
int vis[10];

//当前排列的是第k个数
void perm(int k)
{
    if(k==len)
    {
        res[len]='\0';
        cout<<res<<endl;
        return;
    }else{
        for(int i=0;i<len;i++)
        {
            if(!vis[i])  //从小到大顺序找s[i]没有访问过
            {
                res[k]=s[i];  //先排列当前待排列数组的第一个元素
                vis[i]=1;
                perm(k+1);
                vis[i]=0;
            }
        }
    }

}


int main()
{
    cin>>s;
    len=strlen(s);
    sort(s,s+len);
    memset(vis,0,sizeof(vis));
    perm(0);
    return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值