您的位置:首页 > 其它

算法训练 排列问题

2016-03-28 22:55 399 查看
问题描述

  求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出现在i-1这个数后面,并保证第i行第i列为0),将这个排列看成一个自然数,求从小到大排序第K个排列。

数据规模和约定

  N<=10,K<=500000

输入格式

  第一行为N和K,接下来的N行,每行N个数,0表示不能,1表示能

输出格式

  所求的排列

样例输入

3 2

0 1 1

1 0 0

0 1 0

样例输出

1 0 2

解释:

对于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

#include <stdio.h>

int N, K, count, key;
int a[10][10], num[10];

void swap(int x, int y)
{
int t;

t = num[x];
num[x] = num[y];
num[y] = t;
}

void sort(int from, int end)
{
int i, j, t;

for(i=from; i<end; i++){
t = i;
for(j=i+1; j<end; j++){
if(num[j] < num[t]){
t = j;
}
}
swap(i, t);
}

}

void print()
{
int i;

for(i=0; i<N; i++){
printf("%d ", num[i]);
}
printf("\n");
}

void arrange(int fromIndex)
{
if(fromIndex == N){
count ++;
}
if(count == K){
print();
key = 0;
}

int i;

for(i=fromIndex; i<N; i++){
sort(fromIndex, N);
swap(fromIndex, i);

if(fromIndex == 0) arrange(fromIndex+1);
else if (a[num[fromIndex-1]][num[fromIndex]] != 0){
arrange(fromIndex+1);
}

if(key == 0){
return;
}
}
}

int main()
{
int i, j;

scanf("%d%d", &N, &K);

for(i=0; i<N; i++){
for(j=0; j<N; j++){
scanf("%d", &a[i][j]);
}
}

for(i=0; i<10; i++){
num[i] = i;
}
count = 0;
key = 1;
arrange(0);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字典序排列