标签:hdu
http://acm.hdu.edu.cn/showproblem.php?pid=3699
2 A A A BCD BCD B
5 72
题意很简单,都不知道咋描述。。
就是爆搜下,注意下前导0以及除法别直接除。。
/**
 * @author neko01
 */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define clr(a) memset(a,0,sizeof a)
#define clr1(a) memset(a,-1,sizeof a)
#define dbg(a) printf("%d\n",a)
typedef pair<int,int> pp;
const double eps=1e-8;
const double pi=acos(-1.0);
const int INF=0x7fffffff;
const LL inf=(((LL)1)<<61)+5;
map<char,int>mp;
char s[3][10];
int val[3][10];
int a[10];
bool vis[10];
int ans;
int gao(int x)
{
    int ans=0,len=strlen(s[x]);
    for(int i=0;i<len;i++)
        ans=ans*10+a[val[x][i]];
    return ans;
}
void dfs(int step)
{
    if(step==0)
    {
        if(a[val[0][0]]==0&&strlen(s[0])>1)
            return;
        if(a[val[1][0]]==0&&strlen(s[1])>1)
            return;
        if(a[val[2][0]]==0&&strlen(s[2])>1)
            return;
        int x=gao(0),y=gao(1),z=gao(2);
        if(x+y==z) ans++;
        if(x-y==z) ans++;
        if((LL)x*(LL)y==z) ans++;
        if(y!=0&&(LL)z*(LL)y==x) ans++;
        return;
    }
    for(int i=0;i<10;i++)
    {
        if(!vis[i])
        {
            vis[i]=true;
            a[step]=i;
            dfs(step-1);
            vis[i]=false;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        clr(vis);
        mp.clear();
        clr(val);
        int num=1;
        ans=0;
        for(int i=0;i<3;i++)
        {
            scanf("%s",s[i]);
            int len=strlen(s[i]);
            for(int j=0;j<len;j++)
            {
                if(mp[s[i][j]]==0)
                {
                    mp[s[i][j]]=num++;
                    val[i][j]=mp[s[i][j]];
                }
                else val[i][j]=mp[s[i][j]];
            }
        }
        dfs(num-1);
        printf("%d\n",ans);
    }
    return 0;
}
hdu3699 A hard Aoshu Problem 暴搜
标签:hdu
原文地址:http://blog.csdn.net/neko01/article/details/40753151