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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝少发货店家不承认怎么办 淘宝买东西店家不发货怎么办 淘宝店家拒绝同意退款怎么办 被淘宝店家骂了怎么办 淘宝买家骂店家骚扰店家怎么办? 不想开淘宝店了怎么办 我是客服经常有客户骂人怎么办 淘宝直播前期没人看怎么办 淘宝被投诉商标侵权怎么办 淘宝后商家页面打不开了怎么办 淘宝遇到职业打假人怎么办 发票被复写上字怎么办 淘宝直播广告图片的商品怎么办 美团商家排名低怎么办 想成为淘宝主播怎么办 用移动流量很卡怎么办 淘宝店铺被恶意刷流量怎么办 一个想要公司权利的人怎么办 淘宝商家短信推广告怎么办 在群里乱发信息怎么办 支付宝扫不了码怎么办 淘宝商家收款不发货怎么办 淘宝申请退款商家拒绝怎么办 一件代发找不到供货商怎么办 淘宝京东兼职上当怎么办 退货时快递丢件怎么办 淘宝店铺代销1688有订单怎么办 供应商已解除合作无法代销怎么办 被代运营骗了怎么办 被淘宝运营骗了怎么办 淘宝运营公司骗了怎么办 被金融公司骗了怎么办 天猫品牌方投诉怎么办 淘宝卖家售假被扣了12分怎么办? 淘宝店被投诉了怎么办 淘宝商品被投诉侵权怎么办 淘宝小二胡乱判怎么办 淘宝卖家不干了怎么办 花呗剩下的钱怎么办 蚂蚁花呗无法使用怎么办 淘宝不能用花呗怎么办