HDU 1875 Word Puzzle

2023-12-10 04:38
文章标签 word hdu puzzle 1875

本文主要是介绍HDU 1875 Word Puzzle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1857


题目:

Word Puzzle

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 427    Accepted Submission(s): 76


Problem Description
Did you heard of a little game named "Word Puzzle" ? If you didn't, what a pity !
In the game, you will be given a rectangular grid of letters, in which several words are hidden. Each word may begin anywhere in the puzzle, and may be oriented in any straight line horizontally, vertically, or diagonally. However, the words must all go down, right, or down-right. A dictionary is also given to you, indicating the words to be found in the grid.

You task is to find the locations of each word within the grid.


Input
There is only one test case.

The first line is two integers R and C separated by a whitespace. R (20 ≤ R ≤ 500) is the number of rows of the grid. C (20 ≤ C ≤ 500) is the number of columns of the grid. 

The following R lines, each line will contains exactly C characters without anything else. Each character is in the range 'A' - 'Z'. 

A blank line will be followed after the grid.

The following lines, each line contains a unique word in the dictionary. Each word will contain between 1 and 20 characters ( also in the range 'A' - 'Z'). The dictionary consists of at most 10000 words.

-1 means the end of dictionary.


Output
For each word, output the "ROW COL"(quotes for clarity) pair, where ROW is the 0-based row in which the first letter of the word is found, and COL is the 0-based column in which the first letter of the word is found. If the same word can be found more than once, the location in the lowest-indexed row should be returned. If there is still a tie, return the location with the lowest-indexed column. If a word cannot be found in the grid, return "-1 -1" for the word.

Sample Input
  
3 5 HENRY GAVIN MAGICHENRY HGM HAG MAVIN -1

Sample Output
  
0 0 0 0 0 0 -1 -1

Author
XrtGavin@TJU

Source
HDU 2007 Programming Contest - Final


题目大意:
给一个字母矩阵, 矩阵里可以按照横着,竖着,斜着(左上--->右下方向), 组成单词。
然后询问一些单词,是否存在矩阵中。如果存在,输出它的起点位置(开始位置在越上面,越左边越好)。


分析与总结:
做这题想了足足有两天啊,我容易吗我哭.

1.  初看, 觉得水题一枚, 直接枚举矩阵的起点,然后把矩阵中所有可能的单词都进行建Trie树, 在Trie中要保存起点。然后很开心的提交了,结果Memory Limit Exceeded

2. 然后就一直想啊想啊想.....无线纠结中

3. 终于,我头脑上面的灯泡亮了一下,发现询问的单词只有1W个,那么我们其实就可以把询问单词建成一个Trie树, 然后再枚举矩阵里面的单词,看枚举的单词是否在Trie中,在的话就把位置保存下来。
全部枚举完之后, 在输出在Trie中的询问单词所保存的位置信息。

4. 之后再看看ACM官方标志图片上的那个闪亮的灯泡, 似乎有所感悟...做ACM追求的不就是灯泡亮的那一刻吗?
    如果做ACM题, 灯泡都不亮一下就做出来了,乐趣就少了很多。





代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int KIND = 26;
const int MAXN = 1000000;
int cnt_node;
int R,C;
char map[505][505];
char word[10005][22];struct node{bool isword;int r,c;node* next[KIND];void init(){r=c=-1;isword=false;memset(next, 0, sizeof(next));}
}Heap[MAXN];inline node* new_node(){Heap[cnt_node].init();return &Heap[cnt_node++];
}
// 把询问的单词建Trie树
void insert(node* root, char *str){for(char *p=str; *p; ++p){int ch=*p-'A';if(root->next[ch]==NULL)root->next[ch] = new_node();root=root->next[ch];} root->isword=true;
}
// 对矩阵中枚举的单词查找是否再Trie树中
void search(node* root, char *str, int row, int col){for(char *p=str; *p; ++p){int ch=*p-'A';if(root->next[ch]==NULL)return ;root=root->next[ch];if(root->isword && root->r==-1 && root->c==-1){root->r=row, root->c=col; }}if(root->isword && root->r==-1 && root->c==-1){root->r=row, root->c=col;}
}
// 输出询问的单词在矩阵中的位置
void output(node* root, char *str){for(char *p=str; *p; ++p){int ch=*p-'A';if(root->next[ch]==NULL) return;root=root->next[ch];}if(root->isword)printf("%d %d\n", root->r, root->c);
}int main(){// Trie initcnt_node=0;node* root=new_node();scanf("%d%d%*c",&R,&C);for(int i=0; i<R; ++i){gets(map[i]);}gets(word[0]); //消除空格int pos=0;while(gets(word[pos])){if(word[pos][0]=='-') break;insert(root, word[pos++]);}char str[30];for(int i=0; i<R; ++i){for(int j=0; j<C; ++j){int end_r,end_c=j;// 竖下if(i+20<R)end_r=i+20;else end_r=R;memset(str, 0, sizeof(str));for(int k=i,p=0; k<end_r; ++k)str[p++]=map[k][j];search(root, str, i, j);// 横着if(j+20<C) end_c=j+20;elseend_c=C;memset(str, 0, sizeof(str));for(int k=j,p=0; k<end_c; ++k)str[p++]=map[i][k];search(root, str, i, j);// 斜着int r=i, c=j,p=0;memset(str, 0, sizeof(str));while(r<end_r && c<end_c){str[p++]=map[r][c];++r, ++c;}search(root,str,i,j);}}for(int i=0; i<pos; ++i){output(root, word[i]);}return 0;
}





 ——  生命的意义,在于赋予它意义士。

          原创 http://blog.csdn.net/shuangde800 , By   D_Double  (转载请标明)







这篇关于HDU 1875 Word Puzzle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/476036

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :