递归问题


全排序

// 给定一个数组,打印出这个数组所有的组合
void DSF(int num[],int n,vector<int> &v,bool key[])
{
    if(v.size()>=n){
        for_each(v.begin(),v.end(),[](int n){
            printf("%d",n);
        });
        printf(" ");
        return ;
    }
    for(int i=0;i<n;i++){
        if(!key[i])
            continue;
        v.push_back(num[i]);
        key[i]=false;
        DSF(num,n,v,key);
        v.pop_back();
        key[i]=true;
    }
}
void sortAll(int num[],int n)
{
    if(num==nullptr||n<=0){
        return ;
    }
    vector<int> v;
    bool key[n];
    for(int i=0;i<n;i++){
        key[i]=true;
    }
    DSF(num,n,v,key);
}
int main()
{
    int num[]={1,5,6,7,2};
    sortAll(num,sizeof(num)/sizeof(int));
    return 0;
}

image-20210531213603591


素数环

// 给定一个数组判断,如果通过这个数组的值组成的环,相邻两个元素相加都是素数,则是素数环,则返回true,否则返回false
bool prime(int num[],int n,vector<int> &v,bool key[],bool value[])
{
    if(v.size()>=n){
        int temp=v.back();
        if(value[temp+num[0]]==true){
            for_each(v.begin(),v.end(),[](int n){
                printf("%d ",n);
            });
            printf("\n");
            return true;
        }
        return false;
    }
    for(int i=1;i<n;i++){
        if(key[i]==false)
            continue;
        int temp=v.back();
        if(value[temp+num[i]]==true){
            v.push_back(num[i]);
            key[i]=false;
            if(prime(num,n,v,key,value)==true){
                return true;
            }
            v.pop_back();
            key[i]=true;
        }
    }
    return false;
}

bool ring(int num[],int n)
{
    if(num==nullptr||n<=0){
        return false;
    }
    int primenumber[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,53,59,61,67,71,73,79,83,89,97};
    bool value[100];
    int j=0;
    for(int i=0;i<100;i++){
        if(i==primenumber[j]){
            value[i]=true;
            j++;
            continue;
        }
        value[i]=false;
    }
    vector<int> v;
    bool key[n];
    for(int i=0;i<n;i++){
        key[i]=true;
    }
    v.push_back(num[0]);
    key[0]=false;
    return prime(num,n,v,key,value);
}
int main()
{
    int num[]={1,2,2,3};
    bool key=false;
    key=ring(num,sizeof(num)/sizeof(int));
    if(key){
        cout<<"ok"<<endl;
    }else{
        cout<<"false"<<endl;
    }
    return 0;
}

image-20210531214216191


八皇后问题

// sum表示有多少可行的占位
// num数组的下标代表的是行数,值代表的是列数,例如num[3]=6;代表的是第四行的皇后占的是第七个位置
// num数组只要保证8个行中分布都是0~7之间的数字并且不重复,就可以确保皇后不会在行或者列上冲突
int sum=0;
bool eightqueen(int num[],bool key[],int index)
{
    if(index==8){
        for(int i=0;i<8;i++){
            if(key[i]==true){
                key[i]=false;
                num[index-1]=i;
                for(int j=0;j<index-1;j++){
                    if(index-1-j==num[index-1]-num[j]||index-1-j==num[j]-num[index-1]){
                        key[i]=true;
                        return false;
                    }
                }
                key[i]=true;
                sum++;
                for(int j=0;j<index;j++){
                    cout<<num[j]<<" ";
                }
                cout<<endl;
                return true;
            }
        }
        return false;
    }
    for(int i=0;i<8;i++){
        if(key[i]==false){
            continue;
        }
        key[i]=false;
        num[index-1]=i;
        bool check=true;
        for(int j=0;j<index-1;j++){
            if(index-1-j==num[index-1]-num[j]||index-1-j==num[j]-num[index-1]){
                check=false;
                break;
            }
        }
        if(check==true)
            eightqueen(num,key,index+1);
        key[i]=true;
    }
    return false;
}
bool eightqu(void)
{
    int num[8];
    bool key[8];
    for(int i=0;i<8;i++){
        key[i]=true;
        num[i]=0;
    }
    return eightqueen(num,key,1);
}
int main()
{
    eightqu();
    cout<<sum<<endl;
    return 0;
}

image-20210531214818277


文章作者: dyl
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dyl !
 上一篇
排序算法总结 排序算法总结
详细描述了各个排序算法的实现与优缺点,主要分为三大块:插入排序,交换排序、选择排序等等,本文来自博主看B站教学视频总结,截图来自于B站视频
2023-12-10 dyl
下一篇 
Linux系统命令 Linux系统命令
该文主要是提供给博主复习,可读性较差,不建议阅读,主要讲解Linux下怎么查看设备信息、查看磁盘、查看内存命令
2023-12-10 dyl
  目录