菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  请相信,这是一道水题,读了一周的题意

题意:

题目里面描述的那三个条件可以直接无视,关于罗马数字只要知道一个规则即可,映射如下

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

如果一个字母映射的数字比后一个字母映射的数字小,当前的数字就作为负数.

MXMIII = 1000-10+1000+1+1+1=1993

输入的全是合法的罗马数字,问的问题有俩个,

在罗马数字编码中,s1+s2是否等于s3,如果相等输出Correct,要不然输出Incorrect

在阿拉伯数字编码中s1+s2是否等于s3,

罗马数字到阿拉伯数字编码规则,对于一个罗马数字中字母映射到0-9,当然,阿拉伯数字不能是前导0开头

AC:30ms

#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
#include<memory.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

string valid = "valid";
string impossible = "impossible";
string ambiguous = "ambiguous";
string correct = "Correct";
string incorrect = "Incorrect";
int t[30];
int total = 0;
int vis[30];
int val[10];
char str[100];
int length;
int endLength = 0;
char eqAfterChar;
int sum1 = 0, sum2 = 0;
void table()
{
    t['I' - 'A'] = 1;
    t['X' - 'A'] = 10;
    t['C' - 'A'] = 100;
    t['M' - 'A'] = 1000;
    t['V' - 'A'] = 5;
    t['L' - 'A'] = 50;
    t['D' - 'A'] = 500;
}

void dfs(int cur, int sum)
{
    if(total == 2)
        return;
    if(cur == length)
    {
        if(sum1+sum2 == sum)
            total++;
        return;
    }
    char c = str[cur];
    if(c == '=')
    {
        sum2 = sum;
        sum=0;
        ++cur;
        c = str[cur];
    }
    else if(c == '+')
    {
        ++cur;
        c = str[cur];
        sum1 = sum;
        sum = 0;
    }

    if(vis[c - 'A'] == -1)
    {
        int i = 0;
        if(c == eqAfterChar && endLength != 1)
            i = 1;
        for(; i < 10; i++)
        {
            if(val[i])
                continue;
            val[i] = 1;
            sum = sum * 10 + i;
            vis[c - 'A'] = i;
            dfs(cur + 1, sum);
            sum = (sum-i) / 10;
            vis[c - 'A'] = -1;
            val[i] = 0;
        }
    }
    else
    {
        sum = sum * 10 + vis[c - 'A'];
        dfs(cur + 1, sum);
        sum = sum / 10 - vis[c - 'A'];
    }
}

int main(const int argc, char** argv)
{
    freopen("d:\\1.txt", "r", stdin);
    table();
    while (scanf("%s", str))
    {
        if(str[0] == '#')
            return 0;
        total = 0;
        sum1 = 0, sum2 = 0;
        memset(vis, -1, sizeof(vis));
        memset(val, 0, sizeof(val));
        length = strlen(str);
        int t1 = 0;
        int k = 1;

        for(int i = length - 1; i >= 0;)
        {
            if(str[i] == '=' || str[i] == '+')
            {
                if(str[i] == '=')
                    eqAfterChar = str[i + 1];
                k = -1;
                --i;
                continue;
            }
            if(i != 0 && str[i - 1] != '=' && str[i - 1] != '+')
            {
                if(t[str[i] - 'A'] > t[str[i - 1] - 'A'])
                    t1 = t1 + (t[str[i] - 'A'] - t[str[i - 1] - 'A']) * k;
                else
                    t1 = t1 + (t[str[i] - 'A'] + t[str[i - 1] - 'A']) * k;

                --i;
            }
            else
                t1 += t[str[i] - 'A'] * k;
            if(k == 1)
                endLength++;
            --i;
        }
        if(t1 == 0)
            cout << correct;
        else
            cout << incorrect;
        dfs(0, 0);
        if(total == 0)
            cout << " " << impossible << endl;
        else if(total == 1)
            cout << " " << valid << endl;
        else
            cout << " " << ambiguous << endl;
    }
    return 0;
}

 

posted on 2017-11-25 18:15  好吧,就是菜菜  阅读(224)  评论(0编辑  收藏  举报