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

浙公网安备 33010602011771号