天天看點

火車排程問題,遞歸所有情況

當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);
		}


}
           

繼續閱讀