又是一道ACM题。这题很早前看过的,但是当时没怎么想。今天受人之托,认真做了下,发现也不怎么难。这题做的好高兴,时间,代码长度都比较靠前,虽然数据是随机的,时间上带有偶然性,不过确实很兴奋。最重要的是,一次AC,呵呵。
题目出处:
北大:http://acm.pku.edu.cn/JudgeOnline/problem?id=1213
吉大:http://acm.jlu.edu.cn/joj/showproblem.php?pid=1800&off=1800
题目描述:
给定一个式子(只含下面给定的字符),判断在罗马数字表达式里,是不是成立(成立,输出correct ,否则输出Incorrect) 。对于阿拉伯数字是不是成立 (如果只有一个,则是vaild;多个,则是ambiguous;不可能,则是impossible)。
罗马数字里:
I | 1 | V | 5 | |
X | 10 | L | 50 | |
C | 100 | D | 500 | |
M | 1000 |
阿拉伯数字里:
只要不同的字符对应的数字不同,而且没有前缀0就行了。
题目中,还列举了一些规则,这些都不用管的,只要知道,对于罗马的,如果连续二个字符中,第一个字符对应的数小于第二个字符对应的数,则第一个数为负数。其余的都是正数,直接加起来就行了。
输入:
一个字符串,
输出:
上面已经指出了。
思路:
1。判断罗马数字很简单,因为输入的格式都是正确的,直接根据上面规则就行了。
2。难点在于判断是不是阿拉伯的。我的做法是,先统计出现的不同字符。然后用回溯。假设每个数字对应0~9的情况。
如果超过两种,直接返回,这样算是一个剪枝。用一个visit[]标志,该数字是不是被其他字符用过的。回溯,给每个字符赋值。然后再判断式子成不成立 。
代码: