-
Description
-
求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数能或不能出现在i-1这个数后面,并保证第i行第i列为0),将这个排列看成一个自然数,求从小到大排序第K个排列。
-
Input
-
输入描述:
-
N<=10,K<=500000第一行为N和K,接下来的N行,每行N个数,0表示不能,1表示能
-
Output
-
输出描述:N个数,空格分开
所求的排列 -
Sample Input 1
3 2 0 1 1 1 0 0 0 1 0
-
Sample Output 1
1 0 2
-
Hint
-
样例输出的 解释:
对于N=3的没有任何限制的情况
第一:0 1 2
第二:0 2 1
第三:1 0 2
第四:1 2 0
第五:2 0 1
第六:2 1 0
根据题目所给的限制条件
由于2不能出现在1后面,0不能出现在2后面
第一:0 2 1
第二:1 0 2
第三:2 1 0
-
Source
-
蓝桥杯练习系统 ID: 131 原题链接: http://lx.lanqiao.cn/problem.page?gpid=T131
-
代码部分:
#include <stdio.h>
#define maxnum 100
int n,k;
int count = 0;
int a[maxnum][maxnum];
int c[maxnum];
int b[maxnum];
int perm(int s){
if(s == n){
count++;
if(count == k){
for(int i=0;i<s;i++){
printf("%d ",c[i]);
}
}
}
for(int i=0;i<n;i++){
if(b[i]==0){
if(s-1>=0 && a[c[s-1]][i] == 0){
continue;
}
b[i] = 1;
c[s] = i;
perm(s+1);
b[i] = 0;
}
}
}
int main(){
scanf("%d",&n);
scanf("%d",&k);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
perm(0);
}
842

被折叠的 条评论
为什么被折叠?



