UVA 401

第一次写博客,好激动啊!!!!

这个题最开始我是从网上找大神们的解题思路学着写完的,感觉这道题虽然很水,但是不去仔细读题很难AC,有很多地方不读题就会错。

最令我记忆犹深的是有两个地方,

1。回文串和回文镜像串的判断,由于没有好好读题,导致我把程序写成了:只要先满足回文串再满足所有字符都是镜像符,这个字符串就是回文镜像了,结果我错了N次都没找到问题,可见读题的重要性。

2.关于单个字符的判定,由于理解的问题,这个地方我改正了三遍。

第一遍是因为我把所有单个镜像符都归到镜像回文里面了

第二遍是因为我把所有镜像后还是原来字符的镜像符归到镜像回文里面,但是剩下的镜像符还在镜像大类里面。

第三遍才改对。


//这几天我要重新将刘汝佳的紫书上的前几章的题刷一遍,这道题附上思路更清晰的代码

#include <iostream>
#include <algorithm>
#include <map>
#include <cstdio>
using namespace std;


map<char, char> data;
bool flag1, flag2, flag3;


void Store()
{
    data['A'] = 'A';
    data['E'] = '3';
    data['H'] = 'H';
    data['I'] = 'I';
    data['J'] = 'L';
    data['L'] = 'J';
    data['M'] = 'M';
    data['O'] = 'O';
    data['S'] = '2';
    data['T'] = 'T';
    data['U'] = 'U';
    data['V'] = 'V';
    data['W'] = 'W';
    data['X'] = 'X';
    data['Y'] = 'Y';
    data['Z'] = '5';
    data['1'] = '1';
    data['2'] = 'S';
    data['3'] = 'E';
    data['5'] = 'Z';
    data['8'] = '8';
}


int main()
{
    Store();
    string line;
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    while(cin >> line)
    {
        flag1 = true, flag2 = true, flag3 = true;
        int len = line.size();
        int j, i;
        if(len % 2 == 0)
        {
            i = len / 2;
            j = len / 2 - 1;
        }
        else
        {
            i = j = len / 2;
        }
        for(;i >= 0&& j < len; i--, j++)
        {
            if(len % 2 == 1&& i == len /2)
            {
                char mid = line[i];
                if(!data.count(mid))
                {
                    flag3 = false;
                }
                else
                {
                    if(data[mid] != mid)
                    {
                        flag3 = false;
                    }
                }
            }
            if(line[i] != line[j])
            {
                flag2 = false;
            }
            char k1 = line[i], k2 = line[j];
            if(!data.count(k1)|| !data.count(k2))
            {
                flag1 = false;
            }
        }


        if(flag1)
        {
            char mid, key;
            for(i = len - 1, j = 0; i >= 0&& j < len; --i, j++)
            {
                mid = line[i];
                key = data[mid];
                if(key != line[j])
                {
                    //cout << key << " " << line[j] << endl;
                    flag1 = false;
                }
            }
        }
        if(flag1&& flag2&& flag3)
        {
            cout << line << " -- is a mirrored palindrome.\n" << endl;
        }
        else if(!flag1&& !flag2)
        {
            cout << line << " -- is not a palindrome.\n" << endl;
        }
        else if(!flag1&& flag2)
        {
            cout << line << " -- is a regular palindrome.\n" << endl;
        }
        else if(!flag2&& flag1)
        {
            cout << line << " -- is a mirrored string.\n" << endl;
        }
    }
   // fclose(stdin);//关闭文件
    //fclose(stdout);//关闭文件
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值