Word Puzzles poj 1204
转载请注明出处,谢谢。http://www.cnblogs.com/acmer-roney/archive/2012/09/15/2686997.html ——by Roney.
题意:给你一些字符串矩阵,再给你一些字符串,让你在字符串矩阵中找出给你的每一个字符换的首字母的坐标和这个字符串在字符矩阵中的方向,并且要求按所给字符串顺序输出上述信息。
题解:字典树+BFS。用一个二维矩阵存储字符矩阵,用字典树结构存储所给的字符串,并在字典树的结构中用一个变量记录该字符串是第几个输入的。然后对于字符矩阵的每一个位置向八个方向进行搜索并与字典树中存储的字符串进行匹配,一旦与字典树中的某一个字符串匹配成功就将其首字母在矩阵中的信息记录在相应的信息记录结构体中。最后按照顺序输出这些信息即可。
AC代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int kind=26; 6 const int N=1005; 7 struct TrieNode{ 8 int num; 9 TrieNode *Next[kind]; 10 TrieNode(){ 11 num=0; 12 for(int i=0;i<kind;i++) 13 Next[i]=NULL; 14 } 15 }; 16 struct ANS{ 17 int x,y,d; 18 }ans[N]; 19 char map[N][N],str[N]; 20 int X[]={-1,-1,0,1,1,1,0,-1}; 21 int Y[]={0,1,1,1,0,-1,-1,-1}; 22 TrieNode *Root=NULL; 23 int c,l,w; 24 void Insert(int id,char *s){ 25 TrieNode *p=Root; 26 if(!p)p=Root=new TrieNode; 27 int i=0,branch; 28 while(s[i]){ 29 branch=s[i++]-'A'; 30 if(!p->Next[branch])p->Next[branch]=new TrieNode; 31 p=p->Next[branch]; 32 } 33 p->num=id; 34 } 35 bool ok(int i,int j){ 36 if(i>=0&&i<l&&j>=0&&j<c)return true; 37 return false; 38 } 39 void Search(int mx,int my,int dir){ 40 TrieNode *p=Root; 41 int i=mx,j=my; 42 while(ok(i,j)&&(p->Next[map[i][j]-'A'])){ 43 p=p->Next[map[i][j]-'A']; 44 if((p->num)&&(ans[p->num].d==-1)){ 45 ans[p->num].x=mx; 46 ans[p->num].y=my; 47 ans[p->num].d=dir; 48 } 49 i+=X[dir];j+=Y[dir]; 50 } 51 } 52 void BFS(){ 53 for(int i=0;i<l;i++) 54 for(int j=0;j<c;j++) 55 for(int k=0;k<8;k++) 56 Search(i,j,k); 57 } 58 int main() 59 { 60 //freopen("in.txt","r",stdin); 61 int i; 62 while(scanf("%d %d %d",&l,&c,&w)!=EOF){ 63 for(i=0;i<l;i++) 64 scanf("%s",map[i]); 65 for(i=1;i<=w;i++){ 66 scanf("%s",str); 67 Insert(i,str); 68 ans[i].d=-1; 69 } 70 BFS(); 71 for(i=1;i<=w;i++) 72 printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].d+'A'); 73 } 74 return 0; 75 }
posted on 2012-09-15 21:54 Acmer_Roney 阅读(421) 评论(0) 编辑 收藏 举报