有两种车牌号。让你判断第二种是不是在第一种之后且在第一种出Kth之前的车牌号。

本解中是把前面的字母看成一位十进制的数。自己是一个26或者21进制的数。如果比较时有两种。那么第一种和第一种的最后一个比。第二种和第二种的第一种比。第一种的最后一个 和 第二种的第一个 相差1.。那么。两差相加再加1就是这两个数的差了。

因为没有排除前一个是一种。后一个是第二种的情况RE了好久。

感觉像一个模拟题、但是转换成数字那。又觉得很巧妙。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std;

char l1[] = {"ZZZ9999"};
char l2[] = {"BBBBB00"};
char temp[] = {"BDEFGHJKLNOQRSTUVWXYZ"};
char error[] = {"ACMPI"};

long long ask(char a[], char b[])  // 求两个数字只差。实际上只有两种。
{
    long long sum = 0, suma = 0, sumb = 0;
    if (a[3]>='0' && a[3]<='9' && b[3]>='0' && b[3]<='9')
    {
        for (int i=0; i<3; ++i)
        {
            suma += (a[i]-'A')*pow(26, 2-i);
        }
        suma *= 10000;
        for (int i=3; i<7; ++i)
        {
            suma += (a[i]-'0')*pow(10, 6-i);
        }
        for (int i=0; i<3; ++i)
        {
            sumb += (b[i]-'A')*pow(26, 2-i);
        }
        sumb *= 10000;
        for (int i=3; i<7; ++i)
        {
            sumb += (b[i]-'0')*pow(10, 6-i);
        }
        sum = suma - sumb;    // 传参时 a[]是SM b[]是SI.
    }
    else if (a[3]>='A' && a[3]<='Z' && b[3]>='A' && b[3]<='Z')
    {
        for (int i=0; i<5; ++i)
        {
            int tempc = 1;
            for (int j=0; j<21; ++j)
            {
                if (a[i] == temp[j])
                {
                    tempc = j;
                    break;
                }
            }
            suma += tempc*pow(21, 4-i);
        }
        suma *= 100;
        suma += (a[5]-'0')*10 + (a[6]-'0');
        for (int i=0; i<5; ++i)
        {
            int tempc = 1;
            for (int j=0; j<21; ++j)
            {
                if (b[i] == temp[j])
                {
                    tempc = j;
                    break;
                }
            }
            sumb += tempc*pow(21, 4-i);
        }
        sumb *= 100;
        sumb += (b[5]-'0')*10 + (b[6]-'0');
        sum = suma - sumb;
    }
    else
    {
        suma = ask(a, l2);
        sumb = ask(l1, b);
        sum = suma + sumb + 1;
    }
    return sum;
}

int check(char s[])           // 判断第二个字符串是否合法
{
    bool ok1 = true;
    bool ok2 = true;
    if (s[3]>='A' && s[3]<='Z')
    {
        for (int i=0; i<5; ++i)
        {
            if (s[i] == 'A' || s[i] == 'C' || s[i] == 'I' || s[i] == 'M' || s[i] == 'P')
                return 0;
        }
    }
    for (int i=0; i<3; ++i)
    {
        if (s[i]<'A' || s[i]>'Z')
        {
           ok1 = false;
           break;
        }
    }
    for (int i=3; i<7; ++i)
    {
        if (s[i]<'0' || s[i]>'9')
        {
            ok1 = false;
            break;
        }
    }
    for (int i=0; i<5; ++i)
    {
        if (s[i]<'A' || s[i]>'Z')
        {
            ok2 = false;
            break;
        }
    }
    for (int i=5; i<7; ++i)
    {
        if (s[i]<'0' || s[i]>'9')
        {
            ok2 = false;
            break;
        }
    }
    if (ok1) return 1;
    if (ok2) return 2;
    return 0;
}

int main()
{
    long long int c;
    char sm[10], si[10];
    while(cin >> sm >> si >> c)
    {
        if (sm[0] == '*' && si[0] == '*' && c == 0)
            break;
        if (!check(si))
        {
            cout << "N\n";
            continue;
        }
        if (si[3] >= '0' && si[3] <= '9' && sm[3] >= 'A' && sm[3] <= 'Z')
        {
            cout << "N\n";
            continue;
        }
        long long ans = ask(si, sm);
        if (ans>0 && ans<=c)
        {
            cout << "Y\n";
        }
        else cout << "N\n";
    }
    return 0;
}
View Code

 

 



posted on 2015-07-27 11:51  小小八  阅读(459)  评论(0编辑  收藏  举报