zoukankan      html  css  js  c++  java
  • UVA401

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

    题目大意:

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

    • 如果该串既不是回文串也不是镜像串 则输出 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;
    }
    
  • 相关阅读:
    while (cin>>str)退出死循环
    内存溢出(heap corruption detected:)
    二叉树的遍历--递归+非递归(两种)
    直接插入排序(带哨兵和不带哨兵)
    二项队列
    左式堆
    优先队列之二叉堆与d-堆
    centos6.4 安装code::blocks
    结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
    数据结构与算法分析-开放定址散列表的实现
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294266.html
Copyright © 2011-2022 走看看