算法课程之实现递归

1全排列

/**
    算法名称: 全排列
    详  情  : 旺仔 2020.04.05
    算法想法:递归+每一个组合都是一个序列

**/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000;
int n ;
int P[maxn];
bool HashTable[maxn] ={ false};
void generateP(int index){
    if(index == n + 1){

        for(int i = 1 ; i <= n ; i ++){
            cout<<P[i]<<" ";
        }
        cout<<endl;
        return ;
    }
    for(int i = 1 ;  i <= n ; i ++){

        if(HashTable[i] == false){
            HashTable[i] =true;
            P[index] = i;
            generateP(index+1);
            HashTable[i] = false;

        }
    }


}
int main()
{

    cin >>n;
    memset(P,0,sizeof(P));
    generateP(1);
    return 0;
}

2 N皇后问题(题目) 好像不打表都是TLE emmm

  way1 不带回溯 

/**
    算法名称: N皇后问题(不采用回溯)
    详  情  : 旺仔 2020.04.06
    算法想法:递归+每行每列都只能拥有一个皇后
              所以每一个有可能的组合,以行或列看都是唯一的一个序列
**/

#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10010;
int n;
int Count = 0;  //可能方案的数目
int P[maxn];
bool HashTable[maxn] = {false };

void generateP(int index){
    if(index == n + 1){
        int flag = 0;
        for(int i = 1 ; i  <= n ; i ++ )
        {
            for(int j = i + 1 ; j <= n ;j ++)
            {
                if(abs(i-j)==abs(P[i]-P[j]))
                {
                    flag = 1;
                }
            }
        }

        if(flag == 0)
        {

           // for(int i = 1 ; i <= n ; i ++){
             //   cout<<P[i]<<" ";
            //}
           // cout<<endl;
            Count ++;

        }
         return ;
    }
    for(int i = 1; i <= n ; i ++){
        if(HashTable[i] == false){
            HashTable[i] = true;
            P[index] = i;
            generateP(index + 1);
            HashTable[i] = false;

        }

    }

}


int main()
{
    while(cin >> n)
    {
        Count=0;
        memset(P,0,sizeof(P));
        memset(HashTable,false,sizeof(HashTable));
        generateP(1);
        cout<<Count<<endl;
    }


    return 0;
}

way2 带回溯 

/**
    算法名称: N皇后问题(采用回溯)
    详  情  : 旺仔 2020.04.06
    算法想法: 递归+每行每列都只能拥有一个皇后
              所以每一个有可能的组合,以行或列看都是唯一的一个序列
    回   溯:
**/

#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 10010;
int n;
int Count = 0;  //可能方案的数目
int P[maxn];
bool HashTable[maxn] = {false };
void generateP(int index){

    if(index == n+1){
        Count++;
        return ;
    }
    for(int i = 1 ; i <= n ; i++){
        if(HashTable[i] == false){
                int flag = 0;
            for(int pre = 1 ; pre < index ; pre++){
                //第index列皇后的行号为x,第pre列皇后的行号为P[pre]
                if(abs(index-pre)==abs(i -P[pre])){
                    flag = 1;
                    break;
                }

            }
            if(flag== 0 )
            {
                HashTable[i] = true;
                P[index] = i;
                generateP(index+1);
                HashTable[i] = false;
            }

        }
    }
}


int main()
{
    while(cin >> n&&n)
    {
        Count=0;
        memset(P,0,sizeof(P));
        memset(HashTable,false,sizeof(HashTable));
        generateP(1);
        cout<<Count<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值