zoukankan      html  css  js  c++  java
  • POJ2718【DFS】

    题意:
    给你0到9之间的数,然后让你搞成两个数,求一个最小差异值(被组合的数不允许出现前导0)
    思路:最小差异那么肯定是有一个整数长n/2,另一个长n-n/2,搜一下就好了。

    code:

    #include<cstdio>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    next_permutation(first,end);
    按照字典序列,搞出比他下面的那些排列
    
    /*
    int main()
    {
        int a[3];
        for(int i=0;i<3;i++)
            cin>>a[i];
        while(next_permutation(a,a+3))
        {
            for(int i=0;i<3;i++)
            {
                printf("%d",a[i]);
            }
            puts("");
        }
    }
    */
    
    #define INF 0X3f3f3f3f
    int a[15];
    bool vis[15];
    int b[15];
    int n;
    int ans;
    char s[1010];
    
    //另一半直接搞全排列,然后直接判断取小就行了
    void solve(int aa)
    {
        int len=0;
        int bb;
        for(int i=0; i<n; i++)
        {
            if(!vis[i])
            {
                b[len++]=a[i];
            }
        }
        bb=0;
        for(int i=0; i<len; i++)
            bb=bb*10+b[i];
        sort(b,b+len);
        if(len==1||b[0]!=0)
            ans=min(abs(bb-aa),ans);
        while(next_permutation(b,b+len))
        {
            bb=0;
            for(int i=0; i<len; i++)
                bb=bb*10+b[i];
            if(len==1||b[0]!=0)
                ans=min(abs(bb-aa),ans);
        }
    }
    
    //先搜出一个数;
    void DFS(int k,int res)
    {
        if(k==n/2)
        {
            solve(res);
            return;
        }
        for(int i=0; i<n; i++)
        {
            if(!vis[i])
            {
                if(a[i]==0&&k==0&&n>3)
                    continue;
                vis[i]=1;
                DFS(k+1,res*10+a[i]);
                vis[i]=0;
            }
        }
    }
    //两个输入方式
    void made1()
    {
        gets(s);
        n=0;
        int len=strlen(s);
        for(int i=0; i<len; i++)
        {
            if(s[i]==' ')
                continue;
            else
            {
                a[n++]=s[i]-'0';
                //printf("%d ",a[n-1]);
            }
        }
    }
    void made2()
    {
        n=0;
        char ch;
        while((ch=getchar())!='
    ')
        {
            if(ch==' ')
                continue;
            a[n++]=ch-'0';
        }
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        getchar();
        while(T--)
        {
            //made1();
            made2();
    
            memset(vis,0,sizeof(vis));
            ans=INF;
            DFS(0,0);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    JAVA访问权限控制[zhuan]
    Netstat简介
    查看cpu性能和磁盘空间
    简单linux查询
    linux 三剑客命令(grep,sed ,awk)
    同步、异步的使用场景及好处
    AJAX中同步和异步的区别和使用场景
    在SpringBoot中用SpringAOP实现日志记录功能
    springboot使用@Aspect实现AOP记录日志讲解
    Spring:获取容器中的Bean
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934504.html
Copyright © 2011-2022 走看看