Roman Numerals ---解题报告

来源:互联网 发布:教育云数据什么意思 编辑:程序博客网 时间:2024/05/22 07:03

 又是一道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)。

罗马数字里:

I1      V5X10      L50C100      D500M1000       

阿拉伯数字里:

只要不同的字符对应的数字不同,而且没有前缀0就行了。

 

题目中,还列举了一些规则,这些都不用管的,只要知道,对于罗马的,如果连续二个字符中,第一个字符对应的数小于第二个字符对应的数,则第一个数为负数。其余的都是正数,直接加起来就行了。

 

输入:

一个字符串,

输出:

上面已经指出了。

 

 

思路:

1。判断罗马数字很简单,因为输入的格式都是正确的,直接根据上面规则就行了。

2。难点在于判断是不是阿拉伯的。我的做法是,先统计出现的不同字符。然后用回溯。假设每个数字对应0~9的情况。

如果超过两种,直接返回,这样算是一个剪枝。用一个visit[]标志,该数字是不是被其他字符用过的。回溯,给每个字符赋值。然后再判断式子成不成立 。

 

 

代码:

原创粉丝点击