用待查找的单词建立trie树,然后遍历puzzle表,对于每个遍历到的词,看在trie上是否有对应节点,有就继续,没有退出;假如碰到标记单词结尾的节点,则成功找到一个【为了防止重复查找,找到的单词标记一下】。 /*A 上 B 右上 C 右 D 右下 E 下 F左下 G 左 H 左上*/ const int sup = 1010; const int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; const char DIR[10] = "ABCDEFGH"; struct node { int num;//表示是第几个单词,假如此节点不是单词,默认为0 node *nxt[26]; node() { num = 0; memset(nxt, NULL, sizeof(nxt)); } }*root; char tbe[sup][sup]; int cl, rw, m; void creat(char *ky, int k) { node *tp; int i = 0; if(NULL == root) root = new node(); tp = root; while(ky[i]) { int idx = ky[i] - 'A'; if(NULL == tp -> nxt[idx]) tp -> nxt[idx] = new node(); tp = tp -> nxt[idx]; ++ i; } tp -> num = k; } int x[sup], y[sup]; char fst[sup]; bool vis[sup]; int dfs(int xx, int yy, int k) { int st = xx; int ed = yy; node *tp = root; while(xx > 0 && yy > 0 && xx <= rw && yy <= cl) { int idx = tbe[xx][yy] - 'A'; if(tp -> nxt[idx]) tp = tp -> nxt[idx]; else return 0; if(tp -> num) //找到一个后,可能下面继续延伸还有,所以不能退出 { int tmp = tp -> num; tp ->num = 0; if(!vis[tmp]) { vis[tmp] = true; x[tmp] = st- 1; y[tmp] = ed - 1; fst[tmp] = DIR[k]; } } xx += dir[k][0]; yy += dir[k][1]; } return 0; } int main() { char ky[sup]; scanf("%d %d %d", &rw, &cl, &m); getchar(); for(int i = 1; i <= rw; ++ i) gets(tbe[i] + 1); for(int i = 1; i <= m; ++ i) { scanf("%s", ky); creat(ky, i); } for(int i = 1; i <= rw; ++ i) for(int j = 1; j <= cl; ++ j) for(int k = 0; k < 8; ++ k) dfs(i, j, k);//从(i,j)处,向k方向一直在table表中寻找,看能找到几个trie树中的单词 //能在tbe表中沿着k方向走,并且碰见的每个单词在trie上都有下个节点对应【当碰见num表示非0的节点时,碰见一个,然后】 //将其标记为0,继续向k方向遍历表,同时trie有节点继续走,直到表越界或者trie上碰见NULL节点中断 for(int i = 1; i <= m; ++ i) { printf("%d %d ", x[i], y[i]); putchar(fst[i]), puts(""); } return 0; }