[递归]使用栈解决n辆列车调度问题(列车编号1-n)

引言:

编号为1-n的n辆列车进栈,要获得所有正确序列,则可以先通过获得n辆列车的全排列,然后对每个排列进行正确性检验,

即可以获得所有正确序列。正确性是基于引理,对于一个正确的出栈序列,如果有k

说就是要满足小于边界的所有数必须正序排列。


本程序中,使用循环移位方法获得全排列。循环移位的思路是给定一个序列1 2 3 4 .... n。递归层次多了很难表达,此处

用1234的思维导图演示过程。(图中所有连线均为双箭头,第一层递归顺序是1234->2134->1324->3241->2413->4132->1324)

[递归]使用栈解决n辆列车调度问题(列车编号1-n)_第1张图片



#include 
#include 
#include 

void Permutation(int n);
void Recursion(int *a,int n,int k);
void Print(int *a,int n);
void PrintError(int *a,int n);
void GetStackList(int *a,int n,int k);
static int flag = 0;
static int errorNum = 0;
static int totalNum = 0;

int main()
{
    Permutation(12);
    return 0;
}

void Permutation(int n)
{
    int *a = (int *)malloc(sizeof(int)*n);

    for(int i=0;i n)
    {
        flag = 0;
        totalNum++;
        GetStackList(a,n,n-1);
    }
    else
    {
        int temp;
        for(int i=0;i=0;j--)
    {
        if(a[j] < end)
        {
            if(a[j] < temp)
            {
                temp = a[j];
                continue;
            }
            if(a[j] > temp && flag != -1)
            {
                PrintError(a,n);
                flag = -1;
                errorNum ++;
                return;
            }
        }
        else
        {
            GetStackList(a,n,j);
        }
    }
}

void PrintError(int *a,int n)
{
    printf("\nthis is error list:");
    for(int i=n-1;i>=0;i--)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

void Print(int *a,int n)
{
    for(int i=n-1;i>=0;i--)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

n如果超过了10运算量很大,序号10以下所有排列大概有10×9×8×7....×1=300多万种。

正确的出栈序列可以使用公式计算出来,F(n) = F(0) * F(n-1) + F(1) * F(n-2) + ....... + F(n-1) * F(n-n)

其中F(n-1) = F(0) * F(n-2) + F(1) * F(n-3) + ....... + F(n-1) * F(n-(n-1))


F(1) = F(0) = 1

F(2) = 2

F(3) = 5

F(4) = 14

F(5) = 42

F(6) = 132 


你可能感兴趣的:([递归]使用栈解决n辆列车调度问题(列车编号1-n))