UVA 185 - Roman Numerals
2014-08-24 00:27
399 查看
题目大意:给出一个字符串的等式,问这个字符串是罗马等式吗? 有符合的阿拉伯等式吗?前者是就输出correct or incorrect ,后者就得分情况:impossible 没有符合阿拉伯等式的字母组合,valid 能组成阿拉伯等式的字母组合等于1,ambiguous 能组成阿拉伯等式的字母组合大于等于2,
解题思路:1、能不能组成罗马等式的规则:每个当前的字母(i)的左边的字母(i-1)所对应的值如果比i所对应的值小的话,字母(i-1)的值就取负值,否则就取正值。最后判断是否等是式左右成立。
2、能不能组成阿拉伯等式的话,就是每个字母都可以用 0 - 9 之间的数字去替代,看是否有是左右两边等式成立的。
注意:0单独出现,和出现前导0的情况,都是不要的,需要排除。然后相同的字母表示一样的值。这里就将每个字母的情况都枚举出来,然后去掉0出现错误的情况,dfs()找出符合的组合。
解题思路:1、能不能组成罗马等式的规则:每个当前的字母(i)的左边的字母(i-1)所对应的值如果比i所对应的值小的话,字母(i-1)的值就取负值,否则就取正值。最后判断是否等是式左右成立。
2、能不能组成阿拉伯等式的话,就是每个字母都可以用 0 - 9 之间的数字去替代,看是否有是左右两边等式成立的。
注意:0单独出现,和出现前导0的情况,都是不要的,需要排除。然后相同的字母表示一样的值。这里就将每个字母的情况都枚举出来,然后去掉0出现错误的情况,dfs()找出符合的组合。
#include <cstdio> #include <cstring> int yes, len, count, change[200], vis[10] = {0}; char str[100], letter[8] = {"IVXLCDM"}, record[8]; bool judge() { int rec[200] = {0}, num[3] = {0}, cnt = 0; for (int i = 0; i < len; i++) if (str[i] != '+' && str[i] != '=') { num[cnt] += (change[str[i]] >= change[str[i + 1]] ? change[str[i]] : -change[str[i]]); if (rec[str[i]]++ == 0) record[count++] = str[i]; } else cnt++; return num[0] + num[1] == num[2]; } int DFS(int cur) { if (cur == count) { int num[3] = {0}, cnt = 0; for (int i = 0; i < len; i++) str[i] != '+' && str[i] != '=' ? num[cnt] = num[cnt] * 10 + change[str[i]] : cnt++; if (num[0] + num[1] == num[2]) yes++; } else for (int i = 0; i < 10; i++) { change[record[cur]] = i; if (vis[i] || change[str[0]] == 0) continue; vis[i] = 1; DFS(cur + 1); vis[i] = 0; } return yes; } int main() { while (scanf("%s", str), str[0] != '#') { yes = count = 0; len = strlen(str); change['I'] = 1; for (int i = 1; i < 7; i ++) change[letter[i]] = change[letter[i-1]] * (i % 2 ? 5 : 2); printf(judge() ? "Correct " : "Incorrect "); printf(DFS(0) ? yes > 1 ? "ambiguous\n" : "valid\n" : "impossible\n"); } return 0; }
相关文章推荐
- UVa 185 - Roman Numerals
- uva185 - Roman Numerals
- UVA 185 Roman Numerals
- uva :185 - Roman Numerals(dfs)
- UVa185 - Roman Numerals
- UVa 185 - Roman Numerals
- uva 185 Roman Numerals
- UVA - 185 Roman Numerals(回溯+剪枝)
- uva 185 Roman Numerals (深搜+字符串处理)
- checkio的一些题:Speech Module,Feed Pigeons,Roman numerals,Golden Pyramid,The Most Numbers,Digits Multipl
- UVA 185(暴力DFS)
- Rust: codewars的Roman Numerals Encoder
- POJ 1213 Roman Numerals 笔记
- 【Codewars】Roman Numerals Encoder 正整数转罗马数字
- uva 759 - The Return of the Roman Empire
- (线性数据结构5.4.1)UVA 130 Roman Roulette(标准约瑟夫环问题+替换者)
- CSU1622: Generalized Roman Numerals(区间DP)
- Roman Numerals ---解题报告
- Checkio: Roman numerals
- 1002 Roman numerals