zoukankan      html  css  js  c++  java
  • hdu 3419 The Three Groups

    #include<string.h>
    #include<stdio.h>
    #include <iostream>
    using namespace std;
    
    bool vis[15];
    int a,b,c,s,res,e[15];
    int data1,data2,data3;
    
    //求s个数的全排,并判断是否满足:data1*data2==data3
    void perm(int k)//k从1开始
    {
        int i;
        if(k==s+1)//s=a+b+c
        {
            data1=data2=data3=0;
            for(i=1; i<=a; i++)
                data1=10*data1+e[i];
            for(; i<=a+b; i++)
                data2=10*data2+e[i];
            for(; i<=s; i++)
                data3=10*data3+e[i];
            if(data1*data2==data3)
                res++;
        }
        else //输出的所选数的排序
        {
            for(i=k; i<=s; i++)//i从1到s
            {
                swap(e[k],e[i]);
                perm(k+1);
                swap(e[k],e[i]);  //回溯
            }
        }
    }
    
    //求组合1~9中选s(s=a+b+c)个数的组合
    void dfs(int pos,int k)//pos(数字)从1开始,k~s(个数)从0开始
    {
        if(k==s)
            perm(1);
        else
        {
            if(pos==10)//1~9的搜索
                return;
            if(!vis[pos])
            {
                vis[pos]=1;
                e[k+1]=pos;
                dfs(pos+1,k+1);
                vis[pos]=0;   //回溯
            }
            dfs(pos+1,k);
        }
    }
    
    int main()
    {
        while(cin>>a>>b>>c)
        {
            if(a==0&&b==0&&c==0)
                break;
            s=a+b+c;
            res=0;
            memset(vis,0,sizeof(vis));
            if(a+b>=c && c>=(a>b?a:b))
                dfs(1,0);
            cout<<res<<endl;
        }
        return 0;
    }

     参考较优化代码:

    #include"stdio.h"
    #include"string.h"
    int a,b,c;
    int ans;
    int hash[10];
    int base[11],limit;
    int t_a;
    int t_b;
    void judge()
    {
        int i;
        int t;
        int temp[10];
        t=t_a*t_b;
        if(limit<=t || t<base[c])    return ;
        memset(temp,0,sizeof(temp));
        while(t)
        {
            if(hash[t%10])    return ;
            temp[t%10]=1;
            t/=10;
        }
        t=0;
        for(i=1;i<10;i++)    if(temp[i])    t++;
        if(t!=c)    return ;
        ans++;
    }
    void DFS2(int k)
    {
        int i;
        if(k>=base[b+1])    return ;
        if(base[b]<=k)        {t_b=k;judge();return ;}
        for(i=1;i<10;i++)
        {
            if(hash[i]==0)
            {
                hash[i]=1;
                DFS2(k*10+i);
                hash[i]=0;
            }
        }
    }
    void DFS(int k)
    {
        int i;
        if(k>=base[a+1])    return;
        if(base[a]<=k)
        {
            t_a=k;
            DFS2(0);
            return ;
        }
        for(i=1;i<10;i++)
        {
            if(hash[i]==0)
            {
                hash[i]=1;
                DFS(k*10+i);
                hash[i]=0;
            }
        }
    }
    int main()
    {
        int i;
        while(scanf("%d%d%d",&a,&b,&c),a||b||c)
        {
            if(a==0 || b==0 || c==0)    {printf("0\n");continue;}
            if(a+b-2>c)                    {printf("0\n");continue;}
    
            base[1]=1;
            for(i=2;i<=10;i++)    base[i]=base[i-1]*10;
            limit=base[c+1];
    
            ans=0;
            memset(hash,0,sizeof(hash));
            DFS(0);
            printf("%d\n",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    逆向笔记
    后缀名验证
    hook 虚表
    findhex
    敏捷开发模式下如何划定测试范围
    通过数据库来看互联网系统架构演变
    论技术人的总结习惯
    08.基于IDEA+Spring+Maven搭建测试项目--Maven的配置文件settings.xml
    07.基于IDEA+Spring+Maven搭建测试项目--logback.xml配置
    06.基于IDEA+Spring+Maven搭建测试项目--dubbo-consumer.xml配置
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3130933.html
Copyright © 2011-2022 走看看