原题:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=6&page=show_problem&problem=342

题目大意:

文中规定描述了如下三个概念:

1) “regular palindrome(常规回文)”: 从前往后读与从后往前读是一样的。

2) “mirrored string(镜式串)”: 对于字符串的中轴呈轴对称。

3) “mirrored palindrome(镜式回文)”: 同时满足1) 、2)条件的串。

对于镜式串的定义,还给出了有效的原字符及其对应的翻转字符表。

   Character Reverse Character Reverse Character Reverse
A A M M Y Y
B   N   Z 5
C   O O 1 1
D   P   2 S
E 3 Q   3 E
F   R   4  
G   S 2 5 Z
H H T T 6  
I I U U 7  
J L V V 8 8
K   W W 9  
L J X X  

注意,原题中说字母“o”和数字“0”可以看作相等的字符,因此只有字母“o”是合法字符。题意没错,只是把“o”和“0”打错了。

要求我们根据给出的长度1~20的字符串,判断其相应的类型,并输出规定的结果。

解题分析:

一道普通的字符串处理类的题目。判断类型的题目,我倾向于设置类型标识。根据处理得到的标识得到其类型。

伪代码:

1  保存原字符与翻转字符的对应关系。

2  判断是否为回文串。

2.1  是 -> 添加回文串标志。

2.2  不是 -> 空操作。

3  判断是否为镜式串。

3.1  是 ->添加镜式串标志。

3.2  不是 -> 空操作。

4  根据类型标志判断给定串的类型,输出相应结果。

源码:

/* * File: main.cpp * Author: lostaway * * Created on April 5, 2010, 11:29 PM */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* * */ //characters and their reverses table. char CTable[30] = {'A', 'E', 'H', 'I', 'J', 'L', 'M', 'O', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '5', '8'}, RTable[30] = {'A', '3', 'H', 'I', 'L', 'J', 'M', 'O', '2', 'T', 'U', 'V', 'W', 'X', 'Y', '5', '1', 'S', 'E', 'Z', '8'}, input[30]; const int CRTableLen = 21; //功能:判断str串是否为回文串 int isPalindrome(char str[], int leftStart, int rightStart) { int i = leftStart, j = rightStart; while(1) { if(str[i] != str[j]) { return 0; } i--; j++; if(i < 0) { return 1; } } } //功能: 判断字符a的翻转字符是否为字符b int isReverse(char a, char b) { int i; for(i = 0; i < CRTableLen; i++) { if(a == CTable[i] || a == RTable[i]) { break; } } if(i >= CRTableLen) //this letter didn't has a reverse letter. { return 0; } if(a == CTable[i]) { if(b == RTable[i]) { return 1; } else { return 0; } } else if(a == RTable[i]) { if(b == CTable[i]) { return 1; } else { return 0; } } else { return 0; //只是为了让所有分支都有返回值,去除警告。 } } //功能: 判断串str是否为镜式串 int isMirrored(char str[], int leftStart, int rightStart) { int i = leftStart, j = rightStart; while(1) { if(isReverse(str[i], str[j]) == 0) { return 0; } i--; j++; if(i < 0) { return 1; } } } //功能: 根据tag标志输出相应的结果 void print(int tag) { switch(tag) { case 0: { printf("%s -- is not a palindrome./n", input); break; } case 1: { printf("%s -- is a regular palindrome./n", input); break; } case 10: { printf("%s -- is a mirrored string./n", input); break; } case 11: { printf("%s -- is a mirrored palindrome./n", input); break; } } printf("/n"); } int main(int argc, char** argv) { freopen("input.txt", "r", stdin); int middle, tag, leftStart, rightStart, len; while(scanf("%s", input) != EOF) { len = strlen(input); /* tag == 0 : is not a palindrome. * tag == 1 : is a regular palindrome. * tag == 10 : is a mirrored string. * tag == 11 : is a mirrored palindrome. */ tag = 0; middle = len / 2; if(len % 2 == 0) //划分奇、偶串 { leftStart = middle - 1; rightStart = middle; } else { leftStart = middle; rightStart = middle; } if(isPalindrome(input, leftStart, rightStart)) { tag += 1; } if(isMirrored(input, leftStart, rightStart)) { tag += 10; } print(tag); } return (EXIT_SUCCESS); }

UVaOJ 401 Palindromes相关推荐

  1. UVAoJ --401

    UVAoJ –401 这是第一次写的代码,编写两个函数分别判断镜像和回文,然后就是两个结果的排列组合了,根据结果不同输出不同的判断,但是以下这段代码的结果却是WA.还在理解中 #include < ...

  2. uva 401.Palindromes

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  3. UVa 401 - Palindromes

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=96&page=s ...

  4. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  5. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  6. SUPERBIN技术周刊第6期

    本技术周刊是以周为单位作为里程碑,记录一个程序员视角下的所见,所学,所想.兴趣领域包括:数学,算法,图形,图像,音视频,AI,游戏,软件开发技术,操作系统,开源,以及生活杂记等."不积跬步, ...

  7. uvaoj-401-Palindromes

    比较简单的题目,WA了一次是没看清英文题目的要求. /*uvaoj: 401PROB: Palindromes */ #include<stdio.h> #include<strin ...

  8. UVA401 ​​​​​​​Palindromes【字符串】

    Palindromes UVA - 401 题目传送门 题目大意:给你一个字符串,判断其是回文串还是镜像串. AC代码: #include <cstdio> #include <io ...

  9. 【APIO2014】Palindromes

    #103. [APIO2014]Palindromes 统计 描述 提交 自定义测试 给你一个由小写拉丁字母组成的字符串 ss.我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这 ...

最新文章

  1. COJN 0575 800601滑雪
  2. 群雄逐鹿,谁会赢得自动驾驶之战?
  3. CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
  4. Eclipse显示内存占用
  5. java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
  6. Linux下C语言串口应用编程,Linux下串口C语言编程
  7. Ogg入门--基本命令
  8. C#LeetCode刷题之#590-N叉树的后序遍历(N-ary Tree Postorder Traversal)
  9. hadoop运维之jobtracker无故停止服务
  10. C++实现LRU算法(LeetCode 146 LRU缓存机制)
  11. Kruskal/prim--最小生成树
  12. 基于OpenCV的红绿灯识别代码解析
  13. 最好用的五大服装进销存管理软件,强推第一个
  14. 区块链软件公司:区块链的不可篡改贴合司法存证需求
  15. 网络PPTP协议代理加速器的应用
  16. 【Tools】OBS Studio录制视频教程
  17. 【WebGIS bug】WARNING: Too many active WebGL contexts. Oldest context will be lost.
  18. 【工控】脉冲当量怎么算?
  19. html怎样让图片自动转圈,html5怎样做出图片转圈的动画效果
  20. Dockerfile镜像创建

热门文章

  1. D. Array and Operations
  2. vim快速设置自动缩进
  3. [vba] 函数返回多个值
  4. 机器学习:算法中的泛化误差、偏差、方差、噪声的理解(超详细)
  5. 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
  6. Mac2019-XcodeVS安装指南_建立C探索日记
  7. 【IoT】加密与安全:动态令牌 OTP、HOTP、TOTP 原理解析
  8. 精选的Python框架,库,软件和资源的精选清单【墙裂推荐收藏】
  9. 【路径规划】蚁群算法求解电动汽车充电站与换电站协调路径规划【含GUI Matlab源码 796期】
  10. 人的一生,在追求什么?