这题目其实也不难,要有勇气去写这个代码,额,不过我第一次TLE了,我以为应该会超时的,太小看这个三个循环了
记录下八个方向,本来想一边读入一遍查找的,省得记录结果,不过真的太慢了,所以只好开 一个二维的数组记录咯,
插入的操作基本跟之前的一样,就是查询的时候用递归的方式,这是为了方向看,同时写代码也轻松了许多啦,比较直观
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct node { node *next[26]; int id; }*tree,t; tree root; int px,py; char str[1001][1001]; int res[1001][3]; int n,m,w; int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//八个方向 void insert(char *s1,int d) { tree p=root,newnode; for(;*s1!='\0';s1++) { int i=*s1-'A'; if(p->next[i]!=NULL) p=p->next[i]; else { newnode=(tree)malloc(sizeof(t)); for(int j=0;j<26;j++) newnode->next[j]=NULL; newnode->id=-1; p->next[i]=newnode; p=newnode; } } p->id=d; } void search(tree p,int x,int y,int k) { int i=str[x][y]-'A'; if(p==NULL) return ; if(p->id>-1)//查找到单词,id同时记录了该单词读入时的查询顺序 { res[p->id][0]=px; res[p->id][1]=py; res[p->id][2]=k; } if(x>=n||x<0||y>=m||y<0) return ; search(p->next[i],x+dir[k][0],y+dir[k][1],k);//递归查询k方向上的下一个字母 } void solve() { int i,j,k; for(i=0;i<n;i++) for(j=0;j<m;j++) for(k=0;k<8;k++) { px=i;//记录起始坐标 py=j; search(root,i,j,k); } } void input() { int i,j; char sub[1010]; scanf("%d %d %d",&n,&m,&w); getchar(); for(i=0;i<n;i++) gets(str[i]); root=(tree)malloc(sizeof(t)); for(i=0;i<26;i++) root->next[i]=NULL; root->id=-1; for(j=0;j<w;j++) { gets(sub); insert(sub,j); } } void output() { for(int i=0;i<w;i++) printf("%d %d %c\n",res[i][0],res[i][1],res[i][2]+'A'); } int main() { input(); solve(); output(); return 0; }