Roman Numerals 

The original system of writing numbers used by the early Romans was simple but cumbersome. Various letters were used to represent important numbers, and these were then strung together to represent other numbers with the values decreasing monotonically from left to right. The letters they used and the numbers that were represented are given in the following table.

I 1   V 5
X 10   L 50
C 100   D 500
M 1000      

Thus 1993 was written as MDCCCCLXXXXIII. This system was then superseded by a partially place-oriented system, whereby if the above rule of decreasing values was broken, it meant that the immediately preceding (lower) value was deemed to be `negative' and was subtracted from the higher (out of place) value. In this system 1993 was usually written as MCMXCIII. There is still some controversy as to which letters could precede which other letters, but for the purposes of this problem we will assume the following restrictions:

1.
A letter from the left column can never appear more than three times in a row, and there can never be more than one other occurrence of that letter.

2.
A letter from the right column can never appear more than once.

3.
Once a letter has been used in a `negative' position, all subsequent characters (apart from the one immediately following) may not be greater than that character.

Thus we could write MXMIII for 1993 or CCXCIV for 294, however we could not write ILV for 54, nor could we write LIL for 99. Note that 299 could be written as CCXCIX or CCIC

Given a Roman sum, we can either interpret it as such or as an encoding of an Arabic sum. Thus V+V=X could be interpreted as an ambiguous encoding of an Arabic sum with V  {1, 2, 3, 4} and X = 2 * V. Similarly, X+X=XX could be interpreted as a correct Roman sum but an impossible Arabic encoding (apart from the trivial encoding X = 0) and XX+XX=MXC as an incorrect Roman sum, but a valid encoding with M = 1, X = 9, and C = 8.

Write a program that will read in sums in Roman numerals and determine whether or not they are correct as Roman sums and also whether they are impossible, ambiguous or valid as Arabic encodings. Assume that zero will never appear on its own or as a leading digit, and that no two Roman numerals map onto the same Arabic digit.

Input

Input will consist of a series of lines, each line consisting of an apparent Roman sum, i.e. a valid Roman number, a plus sign (
+
), another valid Roman number, an equal sign (
=
) and another valid Roman number. No Roman number will contain more than 9 letters. The file will be terminated by a line consisting of a single 
#
.

Output

Output will consist of a series of lines, one for each line of the input, and each containing two words. The first word will be one of (
Correct, Incorrect
) depending on whether the Roman sum is or is not correct. The second word will be separated from the first by exactly one space and will be one of the set (impossible, ambiguous, valid) depending on the Arabic sum.

Sample input

V+V=X
X+X=XX
XX+XX=MXC
#

Sample output

Correct ambiguous
Correct impossible
Incorrect valid

题意:分两步,第一步判断输入的罗马数字运算结果对不对。第二步,如果每个字母可以用0-9代替,且不同字母不能重复,且有前导零不考虑。判断有一种还是多种还是没有能使得运算结果正确的答案。

思路:

#include <stdio.h>
#include <string.h> char c[105];
int v[777];
int vv[777];
int vis[777];
int visn[10];
int vvv[10];
int vvvn;
int judge2;
char num[3][11];
void tra() {
judge2 = 0;
vvvn = 0;
memset(vv, 0, sizeof(vv));
memset(vvv, 0, sizeof(vvv));
memset(vis, 0, sizeof(vis));
memset(visn, 0, sizeof(visn));
int nu = 0;
int nul = 0;
memset(num, 0, sizeof(num));
for (int i = 0 ; i <= strlen(c); i ++) {
if (c[i] == '+' || c[i] == '=' || c[i] == '\0') {
num[nul ++][nu] = '\0';
nu = 0;
continue;
}
if (vis[c[i]] == 0)
{
vis[c[i]] = 1;
vvv[vvvn ++] = c[i];
}
num[nul][nu ++] = c[i];
}
}
int judge1() {
int numm[3];
numm[0] = numm[1] = numm[2] = 0;
for (int k = 0; k < 3; k ++) {
for (int i = 0; i < strlen(num[k]); i ++) {
if (v[num[k][i + 1]] <= v[num[k][i]] || i == strlen(num[k]) - 1)
numm[k] += v[num[k][i]];
else
numm[k] -= v[num[k][i]];
}
}
if (numm[0] + numm[1] == numm[2])
return 1;
else
return 0;
} void dfs(int nn)
{
if (judge2 == 2)
return;
if (nn == vvvn) {
int numm[3];
numm[0] = numm[1] = numm[2] = 0;
for (int k = 0; k < 3; k ++) {
for (int j = 0; j < strlen(num[k]); j ++) {
numm[k] = numm[k] * 10 + vv[num[k][j]];
}
}
if (numm[0] + numm[1] == numm[2]) {
judge2 ++;
}
return;
}
for (int i = 0; i <= 9; i ++) {
if (!visn[i]) {
vv[vvv[nn]] = i;
int bo = 0;
if (!vv[vvv[nn]]) {
for (int j = 0; j < 3; j ++) {
if (num[j][0] == vvv[nn] && strlen(num[j]) > 1) {
bo = 1;
break;
}
}
}
if (bo)
continue;
visn[i] = 1;
dfs(nn + 1);
visn[i] = 0;
}
}
}
int main()
{
v['I'] = 1; v['V'] = 5; v['X'] = 10; v['L'] = 50;
v['C'] = 100; v['D'] = 500; v['M'] = 1000;
while (gets(c) != NULL && c[0] != '#') {
tra();
dfs(0);
if (judge1())
printf("Correct ");
else
printf("Incorrect ");
if (judge2 == 0)
printf("impossible\n");
if (judge2 == 1)
printf("valid\n");
if (judge2 == 2)
printf("ambiguous\n");
}
return 0;
}

第一步好处理。。把每个罗马数字转换为数字比较即可

第二步就是暴力。每个字母0-9暴力,如果遇到两种情况就可以直接结束。

UVA 185(暴力DFS)的更多相关文章

  1. hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  2. Strange Country II 暴力dfs

    这题点的个数(<=50)有限, 所以可以纯暴力DFS去搜索 //#pragma comment(linker, "/STACK:16777216") //for c++ Co ...

  3. UVA129 暴力dfs,有许多值得学习的代码

    紫书195 题目大意:给一个困难的串,困难的串的定义就是里面没有重复的串. 思路:不需要重新对之前的串进行判重,只需要对当前的加入的字符进行改变即可. 因为是判断字典序第k个的字符串,所以要多一个全局 ...

  4. 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)

    //never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...

  5. A. The Fault in Our Cubes 暴力dfs

    http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行, ...

  6. UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

    题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上 ...

  7. UVA 818 Cutting Chains 切断圆环链 (暴力dfs)

    题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点. n很小n<=15,所以直接枚举2^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要 ...

  8. UVA 11754 (暴力+中国剩余定理)

    题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...

  9. uva 211(dfs)

    211 - The Domino Effect Time limit: 3.000 seconds A standard set of Double Six dominoes contains 28 ...

随机推荐

  1. dropdownlist无刷新传值

    既然局部刷新,其实没有必要用服务器控件,即便用了服务器控件,也不应该将AutoPostBack="true" ,这将导致页面回发并刷新,因此去掉下拉框的该属性 至于局部改变div的 ...

  2. easyui源码翻译1.32--PropertyGrid(属性表格)

    前言 继承自$.fn.datagrid.defaults.使用$.fn.propertygrid.defaults重写默认值对象.下载该插件翻译源码 属性表格提供The propertygrid pr ...

  3. ElasticSearch大数据分布式弹性搜索引擎使用—从0到1

    阅读目录: 背景 安装 查找.下载rpm包 .执行rpm包安装 配置elasticsearch专属账户和组 设置elasticsearch文件所有者 切换到elasticsearch专属账户测试能否成 ...

  4. JSON对象与JSON数组

    一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"后跟一个":"(冒号):""名称/ ...

  5. 中文乱码的分析 和 从Eclipse设置启动JVM时的字符集(转)

    最近时常碰到中文乱码的问题,eclipse的编码环境设置的都是UTF-8,外部也是以UTF-8的编码进行传参的,但是遇到中文的时候还是因为乱码而产生一系列的错误.在网上查了许多资料,发现这是跟JVM的 ...

  6. 内核驱动中常见的miscdevice、platform_device、platform_driver

    最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统(这两个是两 ...

  7. 在Sublime Text 3中配置编译和运行C++程序

    下载解压MinGW至目标目录,本次安装的解压目录为C:\MinGW 设置环境变量.右击我的电脑,属性-->高级-->环境变量. 在系统环境变量PATH里添加C:\MinGW\bin(如果里 ...

  8. hadoop2.2基准测试

    <hadoop the definitive way>(third version)中的Benchmarking a Hadoop Cluster Test Cases的class在新的版 ...

  9. 《C#并行编程高级教程》第2章 命令式编程 笔记

    Parallel.Invoke 并行执行多个方法,只有在所有方法都执行后才会返回 static void Main(string[] args){    Parallel.Invoke(    () ...

  10. C#值类型以及默认值记录下

    C#的值类型有bool,byte,sbyte,decimal,double,float,int,uint,long,string等 如果我们擅长使用默认值,可以帮助我们减少带来赋值及代码编写. 比如我 ...