军队调度

发表于: 2012年11月15 00:00

今天开始又要做题了.A的第一题.发一下,以表纪念.

本题用递归模拟既可

分四种情况

1 把栈内数据放入左边的队伍中 2把栈内数据放入右边的队伍中 3左边队伍中的人直接到右边的队伍中去 4左边的人到栈中去

:::c++
#include<cstdio>
#include<cstdlib>

#define YZ 3  //左边到栈中去
#define OUT 1 //到右边队伍中去
#define ZY 2 //栈中人到左边队伍中去

int n,m;
int cou;
void dg(int pa,int pb,int pc,int t,int *a,int *b,int *c)
{
    int i;
    int fa[9];
    int fb[9];
    for(i=0;i<n;i++)
    {
        fa[i]=a[i];
        fb[i]=b[i];
    }
    if(pc==n)
    {
        for(i=0;i<n;i++)    printf("%d",c[i]);
        printf("\n");
        cou++;
        return ;
    }
    if(t!=YZ && pb>0)
    {
        fa[pa-1]=fb[pb-1];
        dg(pa-1,pb-1,pc,ZY,fa,fb,c);
    }
    if(pb>0 && pc<n && t!=YZ)
    {
        c[pc]=fb[pb-1];
        dg(pa,pb-1,pc+1,OUT,fa,fb,c);
    }
    if(pa<n && pc<n && t!=ZY)
    {
        c[pc]=fa[pa];
        dg(pa+1,pb,pc+1,OUT,fa,fb,c);
    }
    if(pb<m && pa<n && t!=ZY)
    {
        fb[pb]=fa[pa];
        dg(pa+1,pb+1,pc,YZ,fa,fb,c);
    }
}
int main()
{
    int a[9],b[9],c[9];
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0;i<n;i++)
            a[i]=i+1;
        cou=0;
        dg(0,0,0,0,a,b,c);
        printf("%d\n",cou);
    }
    return 0;
}
© 2018 - fluyy - 粤ICP备17114935号