ACM篇:POJ 1204--Word Puzzles

trie

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAX = 1000;
const int SON = 26;
struct Point
{
    int r;
    int c;
    int dir;
    Point (int r=0, int c=0, int dir=0)
    {
        this->r = r;
        this->c = c;
        this->dir = dir;
    }
};

struct Tree
{
    int mark;
    Tree* son[SON];
    void clear()
    {
        mark = 0;
        for (int i = 0; i < SON; i++)
            son[i] = NULL;
    }
} root;

bool visit[MAX+2];
char table[MAX+2][MAX+2];
char word[MAX+2][MAX+2];
struct Point ans[MAX+2];

void read_table(int, int);
void read_words(int);
void create_tree(int);
void walk_tree(int, int);
int main()
{
    int r, c, n;

    scanf("%d%d%d", &r, &c, &n);
    read_table(r, c);
    read_words(n);

    create_tree(n);
    walk_tree(r, c);

    for (int i = 0; i < n; i++)
        printf("%d %d %c\n", ans[i].r-1, ans[i].c-1, ans[i].dir+'A');
    return 0;
}
int max(int a, int b)
{
    return (a > b) ? a : b;
}
void read_table(int r, int c)
{
    int ch;

    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
        {
            while (!isalpha(ch=getchar()))
                ;
            table[i][j] = ch;
        }
}

void read_words(int n)
{
    for (int i = 0; i < n; i++) 
        scanf("%s", word[i]);
}

void insert_tree(char *str, int ord)
{
    Tree *p = &root;
    int id;

    while (*str)
    {
        id = *str-'A';
        if (p->son[id] == NULL)
        {
            p->son[id] = (struct Tree *)(malloc(sizeof(struct Tree)));
            p->son[id]->clear();
        }

        p = p->son[id]; 
        str++;
    }
    p->mark = ord;
}

void find_tree(int r, int c, int dir, struct Point *ans)
{
    static const int ROW[] = {-1, -1, 0, 1, 1, 1, 0, -1};
    static const int COL[] = {0, 1, 1, 1, 0, -1, -1, -1};

    Tree *p = &root;
    int id;
    int row = r;
    int col = c;

    while (isalpha(table[r][c]))
    {
        id = table[r][c] - 'A';
        if (p->son[id] == NULL)
            return;
        p = p->son[id];
        if (p->mark && !visit[p->mark])
        {
            visit[p->mark] = true;
            ans[p->mark-1] = Point(row, col, dir);
        }
        r += ROW[dir];
        c += COL[dir];
    }
}
void create_tree(int n)
{
    root.clear();

    for (int i = 0 ; i < n; i++)
        insert_tree(word[i], i+1);
}

void walk_tree(int r, int c)
{
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
        {
            for (int k = 0; k < 8; k++)
                find_tree(i, j, k, ans);
        }  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章