• 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;
    }
    
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    Linux设备驱动程序 之 度量时间差
    mysql外键的使用
    tomcat常用配置详解和优化方法
    什么是跨域?跨域解决方法
    springboot+vue项目实战
    利用MySQL数据库如何解决大数据量存储问题?
    在MySQL中存储大文件
    web开发用到的技术
    网络100个知识点
    jetty使用教程
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12878484.html
Copyright © 2020-2023  润新知