HDU 1027 Ignatius and the Princess II(DFS)

题目链接

有点找规律的意思,先把所有的情况都预处理出来,m<= 10000 所以说最多只有8个数字改变。

#include <stdio.h>

#include <string.h>

#define N 10000

int p[N+1][9],o[9],num;

void dfs(int step)

{

    int i;

    if(num > N)

        return ;

    if(step > 8)

    {

        num ++;

        return;

    }

    for(i = 1; i <= 8; i ++)

    {

        if(!o[i])

        {

            o[i] = 1;

            p[num][step] = i;

            dfs(step+1);

            o[i] = 0;

        }

    }

}

int main()

{

    int i,j,n,m;

    int k[10];

    k[1] = 1;

    for(i = 2;i <= 8;i ++)

    k[i] = i*k[i-1];

    num = 1;

    dfs(1);

    for(i = 1; i <= N; i ++)

        for(j = 1; j <= 8 ; j ++)

        {

            if(p[i][j] == 0)

                p[i][j] = p[i-1][j];

        }

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        for(i = 1;i <= 8;i ++)

        {

            if(k[i] > m)

            break;

        }

        for(j = 1;j <= n-i;j ++)

        {

            if(j == 1)

            printf("%d",j);

            else

            printf(" %d",j);

        }

        for(j = 9-i;j <= 8;j ++)

        {

            printf(" %d",p[m][j]+n-i-(8-i));

        }

        printf("\n");

    }

    return 0;

}

  

你可能感兴趣的:(HDU)