zoukankan      html  css  js  c++  java
  • 全排列

    HDU 1716
    利用 DFS 的回溯产生全排列
    DFS 回溯的这点功能是很神奇的
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<cctype>
    #include<algorithm>
    #include <vector>
    #include <queue>
    
    using namespace std;
    #define INF 0x3f3f3f3f
    #define N 100
    
    int a[10];
    int ans[N], k, vis[N];
    
    void DFS(int sum, int num)
    {
        if(num==4)
        {
            ans[k++]=sum;
            return ;
        }
        for(int i=1; i<=4; i++)
        {
            if(!vis[i]&&num==0)
            {
                sum+=a[i]*1000;
                vis[i]=1;
                DFS(sum, num+1);
                vis[i]=0;
                sum-=a[i]*1000;
            }
            else if(!vis[i]&&num==1)
            {
                sum+=a[i]*100;
                vis[i]=1;
                DFS(sum, num+1);
                vis[i]=0;
                sum-=a[i]*100;
            }
            else if(!vis[i]&&num==2)
            {
                sum+=a[i]*10;
                vis[i]=1;
                DFS(sum, num+1);
                vis[i]=0;
                sum-=a[i]*10;
            }
            else if(!vis[i]&&num==3)
            {
                sum+=a[i];
                vis[i]=1;
                DFS(sum, num+1);
                vis[i]=0;
                sum-=a[i];
            }
        }
    }
    
    int main()
    {
        int cnt=0;
        while(1)
        {
            int s=INF;
            scanf("%d%d%d%d", &a[1], &a[2], &a[3], &a[4]);
            for(int i=1; i<=4; i++)
                if(a[i]<s&&a[i]!=0)
                    s=a[i];
            if(a[1]==0 && a[2]==0 && a[3]==0 && a[4]==0)
                break;
            cnt++;
            if(cnt!=1)
                printf("
    ");
            memset(vis, 0, sizeof(vis));
            k=0;
            DFS(0, 0);
            sort(ans, ans+24);
            int f=0;
            for(int i=0; i<24; i++)
            {
                int t=(int)log10(ans[i])+1;
                if((t==4&&i==0) || (t==4&&ans[i]!=ans[i-1]))
                {
                    if(ans[i]/1000!=s)
                    {
                        f=0;
                        s=ans[i]/1000;
                        printf("
    ");
                    }
                    if(!f)
                    {
                        printf("%d", ans[i]);
                        f=1;
                    }
                    else
                        printf(" %d", ans[i]);
                }
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    python递归函数
    python全局替换文件内容脚本第1版
    python的if判断补充
    python装饰器
    python函数作用域
    python函数基础
    python文件操作
    ASCII、Unicode和UTF-8编码的区别
    python基础(二)----数据类型
    python基础第一章
  • 原文地址:https://www.cnblogs.com/9968jie/p/5524595.html
Copyright © 2011-2022 走看看