uva 401(简单字符处理题)

1:判断回文串,倒着念跟顺着念相同即可,不同直接返回false.

2:判断镜像串,只要有逆(进行映射,我处理方法比较复杂,可以用更简单的方法)则将其逆求出,如果没有逆元则不是镜像串。转换之后从右到左跟原串从左到右比较,看是否相同,如果不相同,则返回不是镜像。

3:attention please : In addition, after each output line, you must print an empty line. (因为这个错了4遍)


//  	Accepted 	C++11 	0.016
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

const int maxn = 1000+10;
char vdata[maxn];

bool is_palo(char *data){
	int len = strlen(data);
	for(int i = 0; i < len/2; i ++){
		if(data[i] != data[len-i-1]) return false;
	}
	return true;
}

char reverse(char ch){
	switch(ch){
		case 'A' : return 'A'; 
		case 'E' : return '3'; 
		case 'H' : return 'H'; 
		case 'I' : return 'I';
			
		case 'J' : return 'L'; 
		case 'L' : return 'J'; 
		case 'M' : return 'M'; 
		case 'O' : return 'O'; 

		case 'S' : return '2'; 
		case 'T' : return 'T'; 
		case 'U' : return 'U'; 
		case 'V' : return 'V';
			
		case 'W' : return 'W'; 
		case 'X' : return 'X'; 
		case 'Y' : return 'Y';
		case 'Z' : return '5'; 

		case '1' : return '1'; 
		case '2' : return 'S'; 
		case '3' : return 'E'; 
		case '5' : return 'Z';
			
		case '8' : return '8';
		default : return '0';
	}
}


bool is_mirror(char *data){
	int len = strlen(data);
	int flag = 1;
	memset(vdata, 0, sizeof(vdata));
	for(int i = 0; i < len; i ++){
		char ch = reverse(data[i]);
		//printf("%c\n", ch);
		if(ch == '0') { flag = 0; return false; }
		vdata[i] = ch;
	}
	if(flag == 0) return false;
	else {
		//printf("%s\n", vdata);
		for(int i = 0; i < len; i ++){
			if(data[i] != vdata[len-i-1]) return false;
		}
		return true;
	}
}


int main()
{
	char data[maxn];
	while(scanf("%s", data) != EOF){

		//printf("%d\n", is_prime(data));
		//printf("%d\n", is_mirror(data));
		if(!is_palo(data)) {
			if(!is_mirror(data)) printf("%s -- is not a palindrome.\n\n", data);
			else printf("%s -- is a mirrored string.\n\n", data);
		}
		else {
			if(!is_mirror(data)) printf("%s -- is a regular palindrome.\n\n", data);
			else printf("%s -- is a mirrored palindrome.\n\n", data);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值