zoukankan      html  css  js  c++  java
  • 使用DFS求N个数的全排列

    理解

    我们可以把N个数两两建立无向边(即任意两个结点之间都有边,也就是一个N个结点的完全图),然后对每个点作为起点,分别做一次深度优先遍历,当所有点都已经标记时输出当前的遍历路径,就是其中一个排列,这里需要注意,回溯的时候需要将原先标记的点的标记取消,否则只能输出一个排列。如果要按照字典序,则需要在遍历的时候保证每次遍历都是按照结点从小到大的方式进行遍历的。
    原文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/78921973

    代码

    #include<iostream>
    using namespace std;
    int arr[5] = { 1,2,3,4,5 };
    int visited[5];
    int out[5];
    void DFS(int n,int i)
    {
    	if (i == n)
    	{
    		for (int j = 0; j < n; ++j)
    		{
    			cout << out[j] << " ";
    		}
    		cout << endl;
    	}
    	else
    	{
    		for (int j = 0; j < n; j++)
    		{
    			if (!visited[j])
    			{
    				out[i] = arr[j];
    				visited[j] = 1;
    				DFS(n, i+1);
    				visited[j] = 0;
    			}
    		}
    	}
    	
    }
    int main()
    {
    	DFS(5,0);
    }
  • 相关阅读:
    <O(n),O(1)>的LCA
    hdu6110
    ACM模板
    prufer编码
    UvaLive6893_The_Big_Painting
    HDU5669
    Codeforces786B
    二分图部分总结
    Git简介和Windows下安装步骤
    笔记本电脑插入耳机后无法使用解决办法
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788836.html
Copyright © 2011-2022 走看看