當1 2 3 4 5這幾輛火車按順序進入堆棧中,求火車所有可能出來的順序
思路:
#include "stdio.h"
void ConditionalPermutation(int i,int t,int m,int n);
int OUTPUT[10];
int WAIT[10];
int j;
int main(int argc, char const *argv[])
{
ConditionalPermutation(1,4,0,0);
return 0;
}
void ConditionalPermutation(int i,int t,int m,int n)
{
if(n==t&&m==0)
{
printf("Possiblity~ ");
for(j=0;j<t;j++)
{
printf("%d",OUTPUT[j]);
}
printf("\n");
}
//兩個選擇:1、彈出棧頂元素 2、将x下一個元素壓入元素壓入棧中
//i 即将要壓入的元素
//t 條件排列的總數
//m 棧内元素個數
//n "輸出隊列"中的個數
if (m>=1)
{
//一種選擇:彈出棧頂元素
//保證,目前的棧内有元素
OUTPUT[n]=WAIT[m-1];
ConditionalPermutation(i,t,m-1,n+1);
}
if(i<=t)
{
//另一種選擇:将下一個元素壓入
//保證目前棧未滿
//因為這裡使用的是全局變量是以需要對"棧"進行還原操作
int x;
x=WAIT[m];
WAIT[m]=i;
ConditionalPermutation(i+1,t,m+1,n);
WAIT[m]=x; //主要作用對 POP操作的一個恢複作用
}
}
小變動:
#include "stdio.h"
void ConditionalPermutation(int i,int t,int m,int n);
int OUTPUT[10];
int WAIT[10];
int j;
int main(int argc, char const *argv[])
{
ConditionalPermutation(1,3,0,0);
return 0;
}
void ConditionalPermutation(int i,int t,int m,int n)
{
if(n==t&&m==0)
{
printf("Possiblity~");
for(j=0;j<t;j++)
{
printf("%d",OUTPUT[j]);
}
printf("\n");
}
//兩個選擇:1、彈出棧頂元素 2、将x下一個元素壓入元素壓入棧中
//i 即将要壓入的元素
//t 條件排列的總數
//m 棧内元素個數
//n "輸出隊列"中的個數
if(i<=t)
{
//一種選擇:将下一個元素壓入
//保證目前棧未滿
//因為這裡使用的是全局變量是以需要對"棧"進行還原操作
//目前m指向的位置是即将要插入的位置 !!!
int x;
x=WAIT[m];
WAIT[m]=i;
ConditionalPermutation(i+1,t,m+1,n);
WAIT[m]=x;
}
if (m>=1)
{
//一種選擇:彈出棧頂元素
//保證,目前的棧内有元素
OUTPUT[n]=WAIT[m-1]; //這個正好了解到 !!!,它認為m是即将要插入的位置,是以m-1才是棧頂的元素
ConditionalPermutation(i,t,m-1,n+1);
}
}