zoukankan      html  css  js  c++  java
  • UVa 401

    1.题目大意

    输入字符串,判断其是否为回文串或镜像串。其中,输入的字符串中不含0,且全为合法字符。以下为所有的合法字符及其镜像:

    2.思路

    (1)考虑使用常量数组而不是if或switch来实现对镜像的判断,由此避免过于繁琐的过程。

    (2)" -- is not a palindrome."," -- is a mirrored string."," -- is a regular palindrome."," -- is a mirrored palindrome."这四个输出的判断,实际上是两个部分:是否镜像串,是否回文串。

     输出 是否回文(p) 是否镜像(m) p*2+m
     -- is not a palindrome. 否 0 否 0 0
     -- is a mirrored string. 否 0 是 1 1
     -- is a regular palindrome. 是 1 否 0 2
     -- is a mirrored palindrome. 是 1 否 1 3

    利用上述的方法,将输出存入一个二维字符数组,则可以利用数组便捷地找到字符串对应的输出。

    (3)由于大写字母与数字在ASCII字符集上的位置有间隔,因此要分别判断。

    3.应当注意的问题

    (1)写完以后发现一直WA,然后检查了很久,发现原来是因为少了个换行符。原题中的Sample Output,行与行之间是还有一个换行的。因此,以后写题要注意格式的问题,避免由于格式问题产生的WA。

    (2)在检查的过程中,最后尝试提交时,可以把用于检查的中间输出的代码注释掉。事实上,未必检查一遍就能完成任务,有时往往需要检查很多遍,这样就避免了麻烦。

    4.代码

    #include"stdio.h"
    #include"string.h"
    #include"ctype.h"
    
    const char* rev="A   3  HIL JM O   2TUVWXY51SE Z  8 ";  //定义镜像串有关的常量数组
    const char* output[]= {" -- is not a palindrome."," -- is a mirrored string."," -- is a regular palindrome."," -- is a mirrored palindrome."}; //输出有关的常量数组
    
    char jud(char x)
    {
        if(isalpha(x)) //判断是否为字母,如果是字母的情况下
            return rev[x-'A'];
        else           //如果是数字的情况下
            return rev[x-'0'+25];
    }
    
    int main()
    {
        int i,p,m,l;
        char s[20];      //由题目给出的范围可知
        while(scanf("%s",s)==1)   //这里注意不要用"&s"
        {
            l=strlen(s); 
            p=1;
            m=1;
            for(i=0; i<(l+1)/2; i++)
            {
                if(s[i]!=s[l-i-1]) p=0;    //判断是否回文
                if(s[i]!=jud(s[l-i-1])) m=0;  //判断是否镜像
            }
            printf("%s%s
    
    ",s,output[p*2+m]);  
        }
        return 0;
    }
    

      

    参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著

  • 相关阅读:
    微人事项目-mybatis-持久层
    通过外键连接多个表
    springioc
    Redis 消息中间件 ServiceStack.Redis 轻量级
    深度数据对接 链接服务器 数据传输
    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
    sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
    sql server 远程备份 bak 删除
    冒泡排序
    多线程 异步 beginInvoke EndInvoke 使用
  • 原文地址:https://www.cnblogs.com/rgvb178/p/5944760.html
Copyright © 2011-2022 走看看