20111107

ACM 401 Palindromes

迴文跟鏡像。
迴文做word reverse,
鏡像先word reverse再letter reverse。

/* ACM 401 Palindromes
 * mythnc
 * 2011/11/07 16:22:59   
 * run time: 0.016
 */
#include <stdio.h>
#include <string.h>

#define MAXCHAR 21
#define TRUE    1
#define FALSE   0

int reverse(char *, char *);
int mirror(char *, char *);
int valid(char, char *, int);

int main(void)
{
    char str[MAXCHAR], t[MAXCHAR];

    while (scanf("%s", str) != EOF)
        if (reverse(str, t))
            if (mirror(str, t))
                printf("%s -- is a mirrored palindrome.\n\n", str);
            else
                printf("%s -- is a regular palindrome.\n\n", str);
        else
            if (mirror(str, t))
                printf("%s -- is a mirrored string.\n\n", str);
            else
                printf("%s -- is not a palindrome.\n\n", str);
    return 0;
}

/* reverse: save the reverse of s in t,
 * if t and s are palindrome to each other,
 * return TRUE, else return FALSE */
int reverse(char *s, char *t)
{
    int i, j;

    for (i = 0, j = strlen(s) - 1; i < strlen(s); i++, j--)
        t[i] = s[j];
    t[i] = '\0';

    if (strcmp(s, t) == 0)
        return TRUE;
    return FALSE;
}

/* mirror: if s is a mirror string
 * return TRUE, else return FALSE */
int mirror(char *s, char *t)
{
    char map[21] = {'A', 'E', 'H', 'I', 'J', 'L', 'M', 'O', 'S', 'T',
                    'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '5',
                    '8'};
    char key[21] = {'A', '3', 'H', 'I', 'L', 'J', 'M', 'O', '2', 'T',
                    'U', 'V', 'W', 'X', 'Y', '5', '1', 'S', 'E', 'Z',
                    '8'};
    char m[MAXCHAR];
    int index, i;

    for (i = 0; i < strlen(t); i++)
        if ((index = valid(t[i], map, 21)) >= 0)
            m[i] = key[index];
        else
            return FALSE;
    m[i] = '\0';

    if (strcmp(s, m) == 0)
        return TRUE;
    return FALSE;
} 

/* valid: return the index of char c in map,
 * if c is a valid char, else return -1 */
int valid(char c, char *map, int n)
{
    int i;

    for (i = 0; i < n; i++)
        if (c == map[i])
            return i;

    return -1;
}

沒有留言: