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

  

posted @ 2012-07-11 18:14  Naix_x  阅读(106)  评论(0)    收藏  举报