简述
通过一个游戏,即将手里的卡牌放盒子里的思想,来找出全排列小人每走到头一次
就是一种排列,可以考虑将这个顺序储存起来或展示一下
现将卡牌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;
}