UVA401 - Palindromes(思维)

在这里插入图片描述
在这里插入图片描述

题目大意:

多组输入,输入一个字符串,判断是不是回文串和镜像串,输出要求:

  • 如果该串既不是回文串也不是镜像串 则输出 is not a palindrome.
  • 如果该串是回文但不是镜像串 则输出 is a regular palindrome.
  • 如果该串不是回文但是是镜像串 则输出 is a mirrored string.
  • 如果两个条件都满足 则输出 is a mirrored palindrome.

解题思路:

这道题是紫皮书的入门题,首先我们要打一个镜像表和一个答案表,镜像表用来得到单个字符的镜像字符,答案表则用来判断最后的输出结果。
PS:要注意的是,折半时一定要取到(s.length()+1)/2做一个向上取整,因为如果串长是奇数,中间的字符也要判断一下是不是自己的镜像( 因为这个点WA了3发:( ),再注意一下输出格式 要换两行,AC代码:

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const char* rev="A   3  HIL JM O   2TUVWXY51SE Z  8 ";//镜像表
const char* ans[]={"is not a palindrome.","is a regular palindrome.","is a mirrored string.","is a mirrored palindrome."};//最后的答案
char jx(char ch)//返回镜像字符
{
	if(isalpha(ch))//是字母返回字母镜像
	  return rev[ch-'A'];
	return rev[ch-'0'+25];  //非字母返回数字镜像
}
int main()
{
	string s;
	while(cin>>s)
	{
		int flag=1,flag1=1;//flag用于判断回文 flag1判断镜像
		for(int i=0;i<(s.length()+1)/2;i++)//一定不能写成s.length() 血淋淋的教训 WA三发
		{
			if(s[i]!=s[s.length()-i-1])
			  flag=0;
			if(jx(s[i])!=s[s.length()-i-1])
			  flag1=0;
			if(!flag&&!flag1)
			  break;
		}
		cout<<s<<" -- "<<ans[flag1*2+flag]<<endl<<endl;//换两行
	}
	return 0;
}
posted @ 2020-05-31 15:34  Hayasaka  阅读(52)  评论(0编辑  收藏  举报