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; }


浙公网安备 33010602011771号