HDU 3699 A hard Aoshu Problem 2010 Asia Fuzhou Regional Contest J题 模拟 + 搜索

模拟题,每个字母代表一个数字,最多有五个字母,然后搜索一下即可。

 

View Code
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;

char s1[12], s2[12], s3[12];
int a, b, c;
int len1, len2, len3;
int ans, num;
bool vis[12];

map<char, int> mm; // 表示映射,int表示 字母char是第几个加入map里面的,从1开始(去除重复)
int d[13]; //记录搜索后各字母所对应的值。

void dfs(int dep)
{
    int i, j;
    if(dep == num)
    {
        a = b = c = 0;
        for(i = 0; i < len1; i++)
            a = a * 10 + d[mm[s1[i]]];
        for(i = 0; i < len2; i++)
            b = b * 10 + d[mm[s2[i]]];
        for(i = 0; i < len3; i++)
            c = c * 10 + d[mm[s3[i]]];
    //printf("%d %d %d\n", a, b, c);
        if(a + b == c) ans++;
        if(a == b * c && b != 0) ans++;
        if(a - b == c) ans++;
        if(a * b == c) ans++;
        
        return ;
    }
    for(i = 0; i <= 9; i++)
    {
        if(vis[i]) continue;
        if(dep == mm[s1[0]] && i == 0 && len1 >= 2) continue; // 每个数前面不能是0,去掉这些情况
        if(dep == mm[s2[0]] && i == 0 && len2 >= 2) continue;
        if(dep == mm[s3[0]] && i == 0 && len3 >= 2) continue;
        vis[i] = 1;
        d[dep] = i;
        dfs(dep+1);
        vis[i] = 0;
    }
}
int main()
{
    int i, j, cas;
    scanf("%d", &cas);
    while(cas--)
    {
        num = 1; ans = 0;
        scanf("%s%s%s", s1, s2, s3);
        len1 = strlen(s1);
        len2 = strlen(s2);
        len3 = strlen(s3);
        mm.clear();
        for(i = 0; i < len1; i++)
            if(mm[s1[i]] == 0)     mm[s1[i]] = num++;
        for(i = 0; i < len2; i++)
            if(mm[s2[i]] == 0) mm[s2[i]] = num++;
        for(i = 0; i < len3; i++)
            if(mm[s3[i]] == 0) mm[s3[i]] = num++;
        memset(vis, 0, sizeof(vis));
        dfs(1);
        printf("%d\n", ans);
    }

    return 0;
}

 

 

 

posted @ 2012-09-16 10:18  To be an ACMan  Views(212)  Comments(0)    收藏  举报