首先输入一张字母表,再给出w个单词,找出该单词在字母表中的起点,以及读取方向
A向上B右上C向右......共8个方向
提示:
1)起初我用了暴力的strcmp做,结果RE了,只好换成字典树+DFS
2)此题的输出是一起输出的
#include <stdio.h>
#include <string.h>
int div[10][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
int c,l;
char map[1005][1005];
struct
{
int angel,beats; //知道这是什么么~-~
char ab;
}aa[1005];
struct trie
{
trie *next[30];
int num;
trie()
{
for(int i=0;i<30;i++)
next[i]=NULL;
num=0;
}
};
trie *root;
void build(char *str,int j) //建立字典树
{
int len=strlen(str);
trie *p=root;
for(int i=0;i<len;i++)
{
int id=str[i]-'A';
if(p->next[id]==NULL)
{
p->next[id]=new trie;
}
p=p->next[id];
}
p->num=j; //每个树枝最后保存他的序号,方便遍历的时候保存
}
void dfs(trie *p,int x,int y,int s,int t,int dir)
{
if(p==NULL) //不存在字典树中,跳出
return ;
if(p->num>0) //找到了一个单词,存下,用上之前保存的序号,此处不可break,可能后面还有单词
{
aa[p->num].angel=s;
aa[p->num].beats=t;
aa[p->num].ab='A'+dir;
}
if(x<0||y<0||x>=l||y>=c) //超出map跳出
return ;
dfs(p->next[map[x][y]-'A'],x+div[dir][0],y+div[dir][1],s,t,dir);
return ;
}
int main()
{
int w;
char str[1005];
while(scanf("%d%d%d",&l,&c,&w)!=-1)
{
root=new trie;
for(int i=0;i<l;i++)
scanf("%s",map[i]);
for(int i=1;i<=w;i++)
{
scanf("%s",str);
build(str,i);
}
for(int i=0;i<l;i++)
for(int j=0;j<c;j++)
for(int k=0;k<8;k++)
dfs(root,i,j,i,j,k);
for(int i=1;i<=w;i++)
printf("%d %d %c\n",aa[i].angel,aa[i].beats,aa[i].ab);
}
return 0;
}