POJ 1204 Word Puzzles(字典树+搜索)

题意:在一个字符矩阵中找每个给定字符串的匹配起始位置和匹配方向(A到H表示八个方向);

思路:将给定字符串插入字典树中,遍历字符矩阵,在每个字符处向八个方向用字典树找。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct node
{
    int num;
    node *next[26];
}node;
node *head;
char str[1005][1005],ch[1005][1005];
int n,m,w;
int x,y,direction;
int result[1005][1005];
int dir[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
void init(node *h)
{
    for(int i=0;i<26;i++)
    {
        h->next[i]=NULL;
        h->num=0;
    }
}
void h_insert(char s[],int id)//建树
{
    node *t,*s1=head;
    int n=strlen(s);
    for(int i=0;i<n;i++)
    {
        int k=s[i]-'A';
        if(s1->next[k]==NULL)
        {
            t=new node;
            init(t);
            s1->next[k]=t;
        }
        s1=s1->next[k];
    }
    s1->num=id;
}
void dfs(node *p,int a,int b,int d)//搜索
{
    if(p==NULL) return;

    if(p->num>0)
    {
        result[p->num][0]=x;
        result[p->num][1]=y;
        result[p->num][2]=d;
    }
    if(a<0||b<0||a>=n||b>=m) return;//放在后面判断
    dfs(p->next[str[a][b]-'A'],a+dir[d][0],b+dir[d][1],d);
}
int main()
{
    int i,j,k;
    while(scanf("%d%d%d",&n,&m,&w)!=EOF)
    {
        head=new node;
        init(head);
        memset(str,0,sizeof(str));
        memset(ch,0,sizeof(ch));
        memset(result,0,sizeof(result));
        for(i=0;i<n;i++)
        {
            scanf("%s",str[i]);
        }
        for(i=1;i<=w;i++)
        {
            scanf("%s",ch[i]);
            h_insert(ch[i],i);
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                for(k=0;k<8;k++)
                {
                    x=i;y=j;direction=k;
                    node *p=head;
                    dfs(p,x,y,direction);
                }
            }
        }
        for(i=1;i<=w;i++)
        {
            printf("%d %d %c\n",result[i][0],result[i][1],result[i][2]+'A');
        }
    }
    return 0;
}

 

posted on 2015-05-14 11:18  大树置林  阅读(148)  评论(0编辑  收藏  举报

导航