pku 1204 Word Puzzles

建立好待搜索的字符串,然后八方向遍历那个字母框

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXSIZE 1003

typedef struct TrieNode
{
    TrieNode()
    {
        end=-1;
        memset(next,NULL,sizeof(next));
    }
    int end;
    TrieNode *next[26];
}*Trie;

struct AnsNode
{
    int x,y;
    char ch;
}ans[MAXSIZE];

const int dir[8][2]= {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

int ansx,ansy,k,L,C;
char target[MAXSIZE],map[MAXSIZE][MAXSIZE];

void insert(Trie T,char *str,int idx)
{
    while(*str)
    {
        int i=*str-'A';
        if( !T->next[i] ) T->next[i]=new TrieNode;
        T=T->next[i];
        str++;
    }
    T->end=idx;
}
void destroy(Trie &T)
{
    if(!T) return;
    for(int i=0;i<26;i++)
        destroy(T->next[i]);
    delete T;
    T=NULL;
}

void search(Trie T,int x,int y)
{
    if(!T) return;
    if( T->end != -1)
    {
        ans[ T->end ].x=ansx;
        ans[ T->end ].y=ansy;
        ans[ T->end ].ch=(char)('A'+k);
    }
    if( x<0 || y<0 || x>=L || y>=C) return;
    search( T->next[ map[x][y]-'A' ], x+dir[k][0], y+dir[k][1]);
}

void solve(Trie T,int n)
{
    int i,j;
    for(i=0; i<L; i++)
    {
        for(j=0; j<C; j++)
        {
            for(k=0; k<8; k++)
            {
                ansx=i;
                ansy=j;
                search(T,i,j);
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].ch);
    }
}

int main()
{
    int i,k,w;
    while(scanf("%d %d %d",&L,&C,&w)!=EOF)
    {
        Trie tree=new TrieNode;
        for(i=0; i<L; i++) scanf("%s",map[i]);
        for(k=0;k<w;k++)
        {
            scanf("%s",target);
            insert(tree,target,k);
        }
        solve(tree,w);
    //    destroy(tree);
    }
    return 0;
}

 

posted @ 2010-08-25 19:22  菜到不得鸟  阅读(121)  评论(0)    收藏  举报