UVA401 回文词 Palindromes 题解

题意翻译

输入是一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字00 。所谓回文串,就是反转以后和原串相同,如abbaabb**a 和madammadam 。所谓镜像串,就是左右镜像之后和原串相同,如2S2S 和3AIAE3AIA**E 。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个合法字符的镜像如下表所示:

Character   Reverse
A           A
E           3
H           H
I           I
J           L
L           J
M           M
O           O
S           2
T           T
U           U
V           V
W           W
X           X
Y           Y
Z           5
1           1
2           S
5           Z
8           8

输入的每行包含一个字符串(保证只有上述字符,不含空白字符),判断它是否为回文串和镜像串(共4种组合)。

输入输出样例

输入 #1

NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA

输出 #1

NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.

分析

回文串判断只需要用str[i]与str[len - 1 - i]进行判断,重点在镜像串的判断.

思路1:

使用if - else语句把所有镜像情况列出来,代码段:

int checkMirrored(char low, char high) {
	if (low == 'A') {
		if (high == 'A') {
			return 1;
		}
		else return 0;
	}
	else if (low == 'E') {
		 if (high == '3') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'H') {
		if (high == 'H') {
			return 1;
		}
		else return 0;
	}
	else if (low == 'I') {
		if (high == 'I') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'J') {
		if (high == 'L') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'L') {
		if (high == 'J') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'M') {
		if (high == 'M') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'O') {
		if (high == 'O') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'S') {
		if (high == '2') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'T') {
		if (high == 'T') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'U') {
		if (high == 'U') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'V') {
		if (high == 'V') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'W') {
		if (high == 'W') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'X') {
		if (high == 'X') {
			return 1;
		}
		else return 0;
	}
		else if (low == 'Y') {
		if (high == 'Y') {
			return 1;
		}
		else return 0;
	}	
	else if (low == 'Z') {
		if (high == '5') {
			return 1;
		}
		else return 0;
	}
		else if (low == '1') {
		if (high == '1') {
			return 1;
		}
		else return 0;
	}
		else if (low == '2') {
		if (high == 'S') {
			return 1;
		}
		else return 0;
	}
		else if (low == '5') {
		if (high == 'Z') {
			return 1;
		}
		else return 0;
	}
		else if (low == '8') {
		if (high == '8') {
			return 1;
		}
		else return 0;
	}
		else if (low == '3') {
			if (high == 'E') {
				return 1;
			}
			else return 0;
		}	
	else {
		return 0;
	}	
}

思路2(参考洛谷题解):

使用重定向的输入方法,把镜像对应表复制到data.in文件中,打印对应表到data.out文件中,代码段:

int mir() {
	freopen("data2.in", "r", stdin);
	freopen("data2.out", "w", stdout);
	char a, b;
	while (cin >> a >> b) {
		printf("mir['%c'] = '%c';\n",a, b);
	}
	return 0;
}

思路3(紫书答案):

分成字母和数字,在26个字母对应的位置上,填入对应镜像,在1-9数字的对应位置上,也填上对应镜像.

#include <stdio.h>
#include <string.h>
#include <ctype.h>
const char mir[] = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char *ans[] = {"not a palindrome", "a regular palindrome", "a mirrored string",
	"a mirrored palindrome"}; 
int main() {
	char str[100];
	while (scanf("%s", str) == 1) {
		int len = strlen(str);
		// 判断回文
        int flag1 = 1; 
		// 判断镜像
        int flag2 = 1;
		for (int i = 0; i <= len / 2; i++) {
			if (str[i] != str[len - 1 - i]) {
			flag1 = 0;
			}
			if (checkMir(str[i]) != str[len - 1 - i]) {
			flag2 = 0;
			}
		}
		printf("%s -- is %s.\n\n", str, ans[flag2 * 2 + flag1]);
	}
	return 0;
}                           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值