`

poj-1204-Word Puzzles

阅读更多
题目大意:在一个矩阵puzzle中寻找字典中的单词,输出单词的起始位置和方向;
使用trie树,叶子节点中记录方向和起始坐标,通过对每个puzzle中的字母为起始位置进行bfs即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
char puzzle[1050][1050];
struct node
{
    bool f;
    int next[26];
    int d;
    int x;int y;
    void Init(){f=0;memset(next,-1,sizeof(next));d=9;x=-1;y=-1;};
}a[10000010];
int p=0;
void makeroot()
{
    a[p=0].Init();
}
void insert(char* str)
{
    int i=0;
    int cur=0;
    int index=0;
    int len=strlen(str);
    //cout<<"Insert  "<<str<<endl;
    for(i=0;i<len;i++)
    {
        cur=str[i]-'A';
        if(a[index].next[cur]==-1)
        {
            a[++p].Init();
            a[index].next[cur]=p;
        }
        //cout<<"index now : "<<index<<' '<<cur<<endl;
        index=a[index].next[cur];
    }
    //cout<<index<<"!!!!!!!!!!"<<endl;
    a[index].f=1;
}
int line,column;
bool in(int x,int y)
{
    if(0<=x&&x<line&&y>=0&&y<column)
        return 1;
    else
        return 0;
}
void find(int x,int y,int d)
{
    int index=0;
    int cur;
    int ox;
    int oy;
    ox=x;
    oy=y;
    while(in(x,y))
    {
        cur=puzzle[x][y]-'A';
        //cout<<"&&&&&&&  "<<x<<' '<<y<<' '<<index<<' '<<char(cur+'A')<<' '<<'%'<<a[index].f<<endl;
        if(a[index].f==1)
        {
            //cout<<"Find one!"<<endl;
            a[index].d=d;
            a[index].x=ox;
            a[index].y=oy;
        }
        if(a[index].next[cur]==-1)
        {
            return ;
        }


        index=a[index].next[cur];
        x+=dx[d];
        y+=dy[d];
    }
    if(a[index].f==1)
        {
            //cout<<"Find one!"<<endl;
            a[index].d=d;
            a[index].x=ox;
            a[index].y=oy;
        }

}
int ans(char* str)
{
    int index=0;
    int cur;
    int len=strlen(str);
    for(int i=0;i<len;i++)
    {
        cur=str[i]-'A';

        index=a[index].next[cur];
    }
    //cout<<index<<"$$$$$$$$$$"<<endl;
    return index;

}
char ind[1010][1050];
int main()
{
    int i=0;
    int j=0;
    int word;
    makeroot();
        cin>>line>>column>>word;
    for(i=0;i<line;i++)
    {
            scanf("%s",puzzle[i]);
    }
    //cout<<"puzzle"<<endl;
    for(i=0;i<word;i++)
    {
        scanf("%s",ind[i]);
        //cout<<'&'<<ind[i]<<endl;
        insert(ind[i]);
    }
    //cout<<"step 2"<<endl;
    for(i=0;i<line;i++)
    {

        for(j=0;j<column;j++)
        {
            for(int k=0;k<8;k++)
            {
                find(i,j,k);
            }
        }
    }
    //find(0,15,6);
    //cout<<"step 3"<<endl;
    for(i=0;i<word;i++)
    {
        int key=ans(ind[i]);
        printf("%d %d %c\n",a[key].x,a[key].y,a[key].d+'A');
        //cout<<a[key].x<<' '<<a[key].y<<' '<<char(a[key].d+'A')<<endl;
    }
    return 0;
}

分享到:
评论

相关推荐

    poj-1002源码,没有题解,题解看博客

    poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客poj-1002源码,没有题解,题解看博客

    poj-1009.rar_poj

    【标题】"POJ-1009"是北大在线编程竞赛平台上的一个题目,它涉及到计算机科学中的算法和编程技巧。POJ(Problem Set of Peking University)是中国北京大学主办的一个在线编程竞赛平台,旨在提高学生的算法设计和...

    POJ---1456.Supermarket测试数据及答案

    POJ---1456.Supermarket测试数据及答案,题目描述:A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral ...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    POJ-3299解题

    POJ-3299解题 C++源代码 Description Adapted from Wikipedia, the free encyclopedia The humidex is a measurement used by Canadian meteorologists to reflect the combined effect of heat and humidity. It...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj1068](https://vjudge.net/problem/POJ-1068)、[poj2632](https://vjudge.net/problem/POJ-2632)、[poj1573](https://vjudge.net/problem/POJ-1573)、[poj2993]...

    POJ-2151.rar_poj

    【标题】"POJ-2151.rar_poj"是一个与编程竞赛相关的压缩文件,主要涉及的问题是“检查问题的难度”,并且是为动态规划的实战练习而设计的。这个题目来自于著名的在线编程竞赛平台POJ(Programming Online Judge)。 ...

    poj-1028-Web-Navigation.zip_poj

    【标题】"poj-1028-Web-Navigation.zip_poj" 指向的是一个编程竞赛问题,POJ(Programming Online Judge)平台上的第1028题,名为“Web Navigation”。该问题通常涉及到算法设计和实现,可能是为了考察参赛者的编程...

    poj-2528 Mayor's posters 测试数据及答案

    【标题】"poj-2528 Mayor's posters 测试数据及答案"涉及的是一个编程竞赛中的问题,这个问题来源于POJ(Programming Online Judge)平台,编号为2528。POJ是一个在线的编程练习系统,它提供了一系列的问题供程序员...

    POJ2002-Squares

    2. "POJ2002-Squares.doc":这可能是一个Microsoft Word文档,包含了详细的解题报告,可能包括问题分析、算法描述、解题步骤、运行结果和可能的优化措施等。 详细说明: 在"POJ2002-Squares"这个问题中,参赛者可能...

    POJ-1170.rar_poj

    标题中的“POJ-1170.rar_poj”指的是编程竞赛网站POJ(Programming Online Judge)上的一个问题,编号为1170。POJ是一个在线的编程练习平台,主要面向学习和提升算法与编程技能的用户。这个问题的解决方案可能包含在...

    POJ1496-Word Index

    【标题】"POJ1496-Word Index" 是一个来自北京大学在线判题系统POJ(Problem Set of Peking University)的编程题目。这个题目主要涉及到字符串处理、哈希函数以及查找算法等计算机科学的基础知识。 【描述】"北大...

    POJ2525-Text Formalization【TrieTree】

    《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...

    poj 1000 - 2000 部分题目 官方分类

    《POJ 1000 - 2000 部分题目 官方分类》 编程竞赛,特别是在线判题系统(如POJ,即Problem Online Judge)中的题目,是提升编程技能和算法理解的重要途径。POJ 1000 - 2000 是一个涵盖广泛的题目区间,包含了大量的...

Global site tag (gtag.js) - Google Analytics