hdu 1857 Word Puzzle
来源:互联网 发布:淘宝店铺哪里购买 编辑:程序博客网 时间:2024/04/30 04:55
点击打开链接hdu 1857
思路:字典树
分析:
1 题目要求的是给定的单词第一个字母在这个矩形里面的最小的坐标
2 矩形的最大500*500,单词的来源有三个方向,并且单词的起点和终点在矩形之内都是可能的。所以的如果利用枚举矩形之内的单词,那么肯定是超内存的
3 所以我们必须考虑另一种的方法就是对单词进行建字典树,那么我们只要去枚举单词的可能的起点,然后进行查找相应的单词是不是在树上,如果是的话就标记一下当前的坐标。
4 注意由于单词的来源有三个方向,但是因为要求的如果下相同的情况下要求坐标先r最小然后在c最小,所以应该要注意枚举三个方向的顺序。
代码:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define MAXN 1000010#define MAX 510#define N 30int cnt , n , m;int dir[3][2] = {{0,1},{1,0},{1,1}};char maze[MAX][MAX];char words[10010][MAX];struct Point{ int x; int y;}p[10010];struct Trie{ int flag; Trie *child[N];}trie[MAXN];Trie* root;/*静态分配空间*/Trie* newTrie(){ trie[cnt].flag = -1; for(int i = 0 ; i < N ; i++) trie[cnt].child[i] = NULL; return &trie[cnt++];}/*字典树的插入*/void insert(char *str , int num){ Trie *s = root; int len = strlen(str); for(int i = 0 ; i < len ; i++){ int num = str[i]-'A'; if(s->child[num] == NULL) s->child[num] = newTrie(); s = s->child[num]; } s->flag = num;/*flag标记为是第几个单词*/}/*判断是否在矩形之内*/bool judge(int x , int y){ if(x >= 0 && y >= 0 && x < n && y < m) return true; return false;}/*字典树的查找*/void search(int x , int y , int k){ Trie *s = root; int tmp_x , tmp_y; tmp_x = x , tmp_y = y; while(judge(x , y)){ int num = maze[x][y]-'A'; if(s->child[num] == NULL) return; s = s->child[num]; if(s->flag != -1){/*编号不是-1*/ int num = s->flag; if(p[num].x == -1){ p[num].x = tmp_x; p[num].y = tmp_y; /*这里不能直接break,因为可能其它的单词以它为前缀*/ } } x += dir[k][0]; y += dir[k][1]; }}int main(){ int t = 0; cnt = 0; root = newTrie(); scanf("%d%d%*c" , &n , &m); for(int i = 0 ; i < n ; i++){ for(int j = 0 ; j < m ; j++) scanf("%c" , &maze[i][j]); getchar(); } /*建字典树*/ while(scanf("%s" , words[t]) && strcmp(words[t] , "-1") != 0){ insert(words[t] , t); p[t].x = p[t].y = -1; t++; } /*枚举三个方向的起点*/ for(int i = 0 ; i < n ; i++){ for(int j = 0 ; j < m ; j++){ for(int k = 0 ; k < 3 ; k++) search(i , j , k); } } /*输出*/ for(int i = 0 ; i < t ; i++) printf("%d %d\n" , p[i].x , p[i].y); return 0;}
- hdu 1857 Word Puzzle
- HDU 1857Word Puzzle
- HDU 1875 Word Puzzle
- 【Trie】HDU 1875 Word Puzzle
- Puzzle HDU
- POJ --1204--Word Puzzle
- LIGHTOJ 1256 - Word Puzzle(欧拉路)
- LightOJ - 1256 Word Puzzle(欧拉路)
- HDU Puzzle 3278
- HDU 3278 Puzzle
- HDU - A hard puzzle
- hdu 3095 Eleven puzzle
- HDU 3095 Eleven puzzle
- hdu 4662 MU Puzzle
- HDU 4662 MU Puzzle
- HDU 4662 MU Puzzle
- HDU-4662 MU puzzle
- HDU 4662 MU Puzzle
- C#判断数据库中取出的字段值是否为空(NULL)
- 【WebGUI】——IE,Firefox下通用的js触发click事件方法
- 伪随机数生成算法及性能检验
- SQLSEVER中固定排序
- [iphone]Code Sign error: Provisioning profile XXXX can"t be found
- hdu 1857 Word Puzzle
- Mysql数据库查询重复数据
- 樱唯舞的伤感日志推荐:我最喜欢的是你的笑容
- 作为学科的计算机科学(COMPUTING AS A DISCIPLINE)
- 怎样从10亿查询词找出出现频率最高的10个
- 在含有group by的select语句中获取count()==0的数据
- 解决emlog在nginx下伪静态不能使用问题
- 贡献30本经典Linux学习和开发教程和资料,都是pdf完整版的
- Linux字符之1