zoukankan      html  css  js  c++  java
  • 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
    ",result[i][0],result[i][1],result[i][2]+'A');
            }
        }
        return 0;
    }
  • 相关阅读:
    huffman编码
    查询选修了全部课程的学生姓名【转】
    java中的内部类
    jdbc技术
    多态
    存储过程,触发器,Mysql权限,备份还原
    sql查询重点
    常用的sql基础
    手动+工具开发动态资源
    Tomcat
  • 原文地址:https://www.cnblogs.com/dashuzhilin/p/4502848.html
Copyright © 2011-2022 走看看