游客 Signup | Login
中文 | En

3206 - ALGO-52 排列问题

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

数据规模和约定
  N<=10,K<=500000
 
 
样例输入:
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

 

Input

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

Output

所求的排列

Examples

Input


                

Output


                

Solution C++

#include <algorithm>
#include <iostream>
using namespace std;
#define  N 10
int main()
{
	int n,k,i,j,w,p[N],a[N][N];
	int flag;
	cin>>n>>k;
	for(i=0;i<n;i++)  
		p[i]=i;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cin>>a[i][j];
	do
	{
		flag = 1;
		for(i=0;i<n&&flag;i++)
			for(j=0;j<n&&flag;j++)
			{
				if(i!=j&&!a[i][j])
				for(w=0;w<n-1;w++)
				{
					if(p[w]==i&&p[w+1]==j)
					{
						flag = 0;
						break;
					}
				}
			}
		if(!flag) continue;
		k--;
		if(!k)
		{
			for(i=0;i<n;i++)  
				cout<<p[i]<<" ";
		}
	}
	while(next_permutation(p,p+n));
	return 0;
}

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题