90 排列问题

90 排列问题

作者: Turbo时间限制: 1S章节: 深度优先搜索

问题描述 :

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

样例输入

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

输入说明 :

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

   N<=10,K<=500000

输出说明 :

  所求的排列

输入范例 :
3 2
0 1 1
1 0 0
0 1 0
输出范例 :
1 0 2

#include <iostream>
using namespace std;
const int maxn = 11;
int p[maxn], hashtable[maxn] = { 0 };
int mp[maxn][maxn] = {0};
int n, k;
int num = 0;
void dfs(int index)
{
	if (index == n)
	{
		num++;
		if (num == k)
		{
			for (int i = 0; i < n; i++)
			{
				cout << p[i] ;
				if (i < n-1)
				{
					cout << " ";
				}
			}
			cout << endl;
		}
		return;
	}

	for (int x = 0; x <n; x++)
	{
		if (hashtable[x] == 0&&mp[p[index-1]][x]==1||index==0)
		{
			hashtable[x] = 1;
			p[index] = x;
			dfs(index + 1);
			hashtable[x] = 0;
		}
	}
}

int main()
{
	cin >> n >> k;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> mp[i][j];
		}
	}
	dfs(0);
	return 0;
}

posted @ 2020-05-12 20:40  RabbitJwr  阅读(181)  评论(0编辑  收藏  举报