POJ 1204 Word Puzzles(字典树+搜索)
题意:在一个字符矩阵中找每个给定字符串的匹配起始位置和匹配方向(A到H表示八个方向);
思路:将给定字符串插入字典树中,遍历字符矩阵,在每个字符处向八个方向用字典树找。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef struct node { int num; node *next[26]; }node; node *head; char str[1005][1005],ch[1005][1005]; int n,m,w; int x,y,direction; int result[1005][1005]; int dir[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1}; void init(node *h) { for(int i=0;i<26;i++) { h->next[i]=NULL; h->num=0; } } void h_insert(char s[],int id)//建树 { node *t,*s1=head; int n=strlen(s); for(int i=0;i<n;i++) { int k=s[i]-'A'; if(s1->next[k]==NULL) { t=new node; init(t); s1->next[k]=t; } s1=s1->next[k]; } s1->num=id; } void dfs(node *p,int a,int b,int d)//搜索 { if(p==NULL) return; if(p->num>0) { result[p->num][0]=x; result[p->num][1]=y; result[p->num][2]=d; } if(a<0||b<0||a>=n||b>=m) return;//放在后面判断 dfs(p->next[str[a][b]-'A'],a+dir[d][0],b+dir[d][1],d); } int main() { int i,j,k; while(scanf("%d%d%d",&n,&m,&w)!=EOF) { head=new node; init(head); memset(str,0,sizeof(str)); memset(ch,0,sizeof(ch)); memset(result,0,sizeof(result)); for(i=0;i<n;i++) { scanf("%s",str[i]); } for(i=1;i<=w;i++) { scanf("%s",ch[i]); h_insert(ch[i],i); } for(i=0;i<n;i++) { for(j=0;j<m;j++) { for(k=0;k<8;k++) { x=i;y=j;direction=k; node *p=head; dfs(p,x,y,direction); } } } for(i=1;i<=w;i++) { printf("%d %d %c\n",result[i][0],result[i][1],result[i][2]+'A'); } } return 0; }
有些梦想现在不去实现,以后就再也没机会了!!