题目
http://acm.hdu.edu.cn/showproblem.php?pid=1934
题意
给两个车牌号判断是否合法以及第二个车牌的序号是否在第一个后面C以内(包含)
解法
注意判断车牌是否合法
代码
#include <cstdio>
#include <cstring>
bool isLetter(char c) {
if(c >= 'A' && c <= 'Z') {
return true;
}
return false;
}
int getType(char* s) {
if(isLetter(s[5]) || isLetter(s[6]) || !isLetter(s[0]) || !isLetter(s[1]) || !isLetter(s[2])) {
return 0;
}
else if(isLetter(s[4])) {
if(!isLetter(s[3])) {
return 0;
}
else {
for(int i = 0; i < 5; i++) {
if(s[i] == 'A' || s[i] == 'C' || s[i] == 'M' || s[i] == 'I' || s[i] == 'P') {
return 0;
}
}
return 2;
}
}
else if(isLetter(s[3])) {
return 0;
}
else {
return 1;
}
}
int getpos(char c) {
if(c == 'B') {
return 0;
}
else if(c < 'I') {
return c - 'A' - 2;
}
else if(c < 'M') {
return c - 'A' - 3;
}
else if(c < 'P') {
return c - 'A' - 4;
}
else {
return c - 'A' - 5;
}
}
int getdis(char* s, int type) {
int sum = 0;
if(type == 1) {
for(int i = 0; i < 3; i++) {
sum = sum * 26 + s[i] - 'A';
}
for(int i = 3; i < 7; i++) {
sum = sum * 10 + s[i] - '0';
}
return sum;
}
else {
for(int i = 0; i < 5; i++) {
sum = sum * 21 + getpos(s[i]);
}
for(int i = 5; i < 7; i++) {
sum = sum * 10 + s[i] - '0';
}
return sum + 175759999 + 1;
}
}
int main() {
char s1[8], s2[8];
int c;
while(scanf("%s %s %d", s1, s2, &c)) {
if(s1[0] == '*') {
break;
}
int t1 = getType(s1);
int t2 = getType(s2);
if(!t1 || !t2) {
printf("N\n");
}
else {
int dis1 = getdis(s1, t1);
int dis2 = getdis(s2, t2);
if(dis1 < dis2 && dis2 <= dis1 + c) {
printf("Y\n");
}
else {
printf("N\n");
}
}
}
return 0;
}