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