• 【IT面试题004】全排列


    使用深度优先搜索

    /*
    
    套用深度优先搜索之全排列
    全排列 
    
    输入: n(<=26)
    输出:将 前n个小写字母全排列输出
    */
    
    #include "stdafx.h"
    
    #include <iostream>
    
    #include <string>
    #include <vector>
    using namespace std;
    
    int gN;
    const int MAX_ELEMENT = 10000;
    char solution[MAX_ELEMENT];
    int selected[26];
    int gCurNum; 
    int gSolCount;
    void PrintSolution()
    {
    	for (int i = 0;i < gN;i++)
    	{
    		cout << solution[i] << " ";
    	}
    	cout << endl;
    }
    void Go()
    {
    	if (gCurNum == gN)
    	{
    		gSolCount ++;
    		PrintSolution();
    		return;
    	}
    
    	for (char c = 'a';c < 'a' + gN;c++ )
    	{
    		if (selected[c] == 0)
    		{
    			gCurNum++;
    			solution[gCurNum - 1] = c;
    			selected[c] = 1;
    			Go();
    			gCurNum --;
    			selected[c] = 0;
    		}
    	}
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	gN = 9;
    	memset(selected,0,sizeof(selected));
    	gCurNum = 0;
    	gSolCount = 0;
    	Go();
    	cout << gSolCount << endl;
    }
    
     
    还有一个比较巧妙的递归版本
    void Swap(char & a,char &b)
    {
    	char t = a;
    	a = b;
    	b = t;
    }
    void Permutation(char * pElement,int N,int startIdx)
    {
    	if (startIdx == N)
    	{
    		gSolCount ++;
    		//PrintElement(pElement,N);
    		return;
    	}
    
    	Permutation(pElement,N,startIdx + 1);
    	for (int i = startIdx + 1;i < N;i++)
    	{
    		Swap(pElement[startIdx],pElement[i]);
    		Permutation(pElement,N,startIdx + 1);
    		Swap(pElement[startIdx],pElement[i]);
    	}
    }
    void TestPermutation()
    {
    	gN = 9;
    	gSolCount = 0;
    	char elements[26];
    	for (int i = 0;i<gN;i++)
    	{
    		elements[i] = 'a' + i;
    	}
    
    	Permutation(elements,gN,0);
    	cout << gSolCount << endl;
    }
  • 相关阅读:
    【硬件】PCB设计步骤
    【modbus】modbus协议入门讲解
    【I2C】上拉电阻的选择
    【运放】失调电压、偏置电流
    【硬件】模拟地和数字地的隔离
    【电力】电流互感器和电压互感器
    【电力】为什么高电压传输时线路损耗小
    【办公】pdf转ppt的方法
    【EMC】电压暂降、短时中断和电压变化
    js 下的 split
  • 原文地址:https://www.cnblogs.com/speedmancs/p/2072753.html
Copyright © 2020-2023  润新知