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;
}
水题,直接暴力枚举数字,注意处理前导零的情况。#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 A hard Aoshu Problem(暴力枚举)(2010 Asia Fuzhou Regional Contest)
- HDU 3699(J) ——A hard Aoshu Problem(DFS暴力搜索)
- hdu 3699 10 福州 现场 J - A hard Aoshu Problem 暴力 难度:0
- HDU 3699 A hard Aoshu Problem (暴力搜索)
- HDU 3699 A hard Aoshu Problem (暴力搜索)
- HDU 1814 Peaceful Commission (2-sat暴力染色)
- HDU 5063 Operation the Sequence(暴力)
- HDU 1394 Minimum Inversion Number (线段树,暴力)
- HDU 1248 开始以为是贪心,后来才知道是暴力!!!!!
- hdu 4610 Cards(暴力+miller-rabin)
- hdu 5128 暴力枚举
- HDU 1407 测试你是否和LTC水平一样高 (暴力)
- hdu 1407 1248 暴力枚举
- HDU 4403 A very hard Aoshu problem (暴力+状态压缩)
- H - Selecting courses HDU - 3697 (暴力,枚举,贪心)
- hdu 3720 Arranging Your Team(暴力)
- 2015多校第6场 HDU 5355 Cake 贪心,暴力DFS
- HDU-4618 Palindrome Sub-Array 暴力枚举
- HDU 3156 Repair Depots DLX 计算几何 二分 暴力
- HDU - 4737 A Bit Fun 暴力水题