您的位置:首页 > 其它

HDU-3699 暴力

2016-08-04 21:11 162 查看
题意:给三个字符串,最多只含ABCDE五个字母,每个字母代表不同的数字,有多少种可能第一个和第二个通过加减乘除可以得到第三个数字。

水题,直接暴力枚举数字,注意处理前导零的情况。#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int d[10];
int vis[20];
char sa[20], sb[20], sc[20];
int ans;
void dfs(int u) {
if(u == 5) {
long long a = 0, b = 0, c = 0, i;
if(d[sa[0] - 'A'] == 0 && sa[1]) return;
if(d[sb[0] - 'A'] == 0 && sb[1]) return;
if(d[sc[0] - 'A'] == 0 && sc[1]) return;
for(i = 0; sa[i]; i++) {
a = a * 10 + d[sa[i] - 'A'];
}
for(i = 0; sb[i]; i++) {
b = b * 10 + d[sb[i] - 'A'];
}
for(i = 0; sc[i]; i++) {
c = c * 10 + d[sc[i] - 'A'];
}

if(a * b == c) {
ans++;
// cout << a << '*' << b << '=' << c << endl;
}

if(a - b == c) {
ans++;
// cout << a << '-' << b << '=' << c << endl;
}

if(a + b == c) {
ans++;
// cout << a << '+' << b << '=' << c << endl;
}

if(b && a == b * c) {
ans++;
// cout << a << '/' << b << '=' << c << endl;
}

return;
}
if(d[u] == -1) {
return dfs(u + 1);
}
for(int i = 0; i < 10; i++) {
if(vis[i]) continue;
vis[i] = 1;
d[u] = i;
dfs(u + 1);
vis[i] = 0;
}
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%s%s%s", sa, sb, sc);
memset(d, -1, sizeof(d));
for(int i = 0; sa[i]; i++) {
d[sa[i] - 'A'] = 0;
}
for(int i = 0; sb[i]; i++) {
d[sb[i] - 'A'] = 0;
}
for(int i = 0; sc[i]; i++) {
d[sc[i] - 'A'] = 0;
}
ans = 0;
dfs(0);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU 3699