全排列 (方法二): 游戏类比法

简述

        通过一个游戏,即将手里的卡牌放盒子里的思想,来找出全排列小人每走到头一次

就是一种排列,可以考虑将这个顺序储存起来或展示一下

                         现将卡牌5放入箱子1中,往后走

 需要将5放入箱子2,但5已经被使用过(在其他箱子中),只能现将6放入箱子2,往后走

 应将5放入箱子3,但5被使用了,同理卡牌6也被使用了,将卡牌9放入箱子3,往后走

 再往后走,发现走到头了,同时也是一种排列的结果

 退回来,将9收回

 除了9以外没有可放置的卡牌,因为9已经放过,继续回退收回6

 9还没有放入过箱子2,将9放到箱子2中,往后走

6还没有放过箱子3,将6放入箱子3,往后走

 

继续回退,执行相同的步骤,直到全部排列完为止

代码实现

void all_permutation(int cards[], int box[],bool flags[],int size,int curPos)
{
    //对卡牌进行遍历
    for (int i=0;i<size;i++)
    {    //如果卡牌还在,就放入箱子
        if (flags[i] == false)
        {
            //将卡片放入箱子
            box[curPos] = cards[i];
            //标记卡牌已经放入了箱子,不在手里了
            flags[i] = true;
            //往后走
            all_permutation2(cards,box,flags,size,curPos+1);
            //回退后回收卡牌
            flags[i] = false;
        }
    }

    //如果小人走到了末尾,即一种排序完成
    if (curPos == size)
    {
        for (int i=0;i<size;i++)
        {
            cout << box[i] << " ";
        }
        cout << endl;
    }
}

int main()
{
    int cards[3] = {1,2,3};    //卡片
    int box[3];           //箱子
    bool flags[3] = {0,0,0};    //标记对应位置卡片是否还在
    all_permutation(cards,box,flags,3,0);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值