Word Puzzles UVA - 1127(字典樹+bfs)
阿新 • • 發佈:2018-11-10
題意:首先給出一個巨大的謎陣,然後給出一系列單詞,問這個單詞再謎陣中第幾個位置以哪個方向(一共八個方向)查出來的,最後輸出答案即可。
題解:先把這些單詞都插入到字典樹中,然後把謎陣按照八個方向暴搜即可。
附上程式碼:
#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; }