1. 程式人生 > >Word Puzzles UVA - 1127(字典樹+bfs)

Word Puzzles UVA - 1127(字典樹+bfs)

傳送門

題意:首先給出一個巨大的謎陣,然後給出一系列單詞,問這個單詞再謎陣中第幾個位置以哪個方向(一共八個方向)查出來的,最後輸出答案即可。

題解:先把這些單詞都插入到字典樹中,然後把謎陣按照八個方向暴搜即可。

附上程式碼:


#include<bits/stdc++.h>

using namespace std;

const int maxnode=1e6+50;
const int sigma_size=26;
const int maxn=1e3+50;

char mapp[maxn][maxn],word[maxn][maxn];
int ans[maxn][3];
int t,l,c,w;
int visited[maxn];
int dir[][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

struct Trie{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int sz;
    void clear(){
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
        memset(val,0,sizeof(val));
    }
    int idx(char c){
        return c-'A';
    }
    void insert(char *s,int v){
        int u=0,n=strlen(s);
        for(int i=0;i<n;i++){
            int c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    void find_prefixes(int x,int y,int d){
        int u=0;
        int xx=x,yy=y;
        while(xx>=0&&xx<l&&yy>=0&&yy<c){
            int c=idx(mapp[xx][yy]);
            if(!ch[u][c]){
                break;
            }else{
                u=ch[u][c];
            }
            if(val[u]){
                if(!visited[val[u]]){
                    ans[val[u]][0]=x;
                    ans[val[u]][1]=y;
                    ans[val[u]][2]=d;
                }
                visited[val[u]]=1;
            }
            xx+=dir[d][0];
            yy+=dir[d][1];
        }
    }
};
Trie trie;

int main()
{
    scanf("%d",&t);
    while(t--){
        memset(visited,0,sizeof(visited));
        scanf("%d%d%d",&l,&c,&w);
        for(int i=0;i<l;i++){
            scanf("%s",mapp[i]);
        }
        trie.clear();
        for(int i=1;i<=w;i++){
            scanf("%s",word[i]);
            trie.insert(word[i],i);
        }
        for(int i=0;i<l;i++){
            for(int j=0;j<c;j++){
                for(int k=0;k<8;k++){
                    trie.find_prefixes(i,j,k);
                }
            }
        }
        for(int i=1;i<=w;i++){
            printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');
        }
    }
    return 0;
}