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())!='\n')
    {
        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\n",ans);
    }
    return 0;
}
posted @ 2016-06-03 13:53  see_you_later  阅读(186)  评论(0编辑  收藏  举报