http://poj.org/problem?id=1204
分析:对要查找的单词建立字典树,然后对table进行顺序遍历,查找方向:A~H(A:north)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=1005;
char str[NM][NM];
int save[NM][3],n,m;
int c[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
struct Node{
Node *next[26];
int id;
Node(){
for(int i=0;i<26;i++)
next[i]=NULL;
id=-1;
}
};
void BuildT(Node *pt,char *s,int id){
int i,t,len;
len=strlen(s);
for(i=0;i<len;i++){
t=s[i]-'A';
if(pt->next[t]==NULL)
pt->next[t]=new Node();
pt=pt->next[t];
}
pt->id=id;
}
void BFS(Node *pt,int x,int y,int k){
int x1=x,y1=y;
while(pt!=NULL){
if(pt->id!=-1){
save[pt->id][0]=x1;
save[pt->id][1]=y1;
save[pt->id][2]=k;
}
if(x>=0&&x<n && y>=0&&y<m){
int t=str[x][y]-'A';
if(pt->next[t]!=NULL)
pt=pt->next[t];
else return;
}
else return;
x+=c[k][0];y+=c[k][1];
}
}
int main()
{
int i,j,num,k;
char cs[NM];
scanf("%d%d%d",&n,&m,&num);
Node *pt=new Node();
for(i=0;i<n;i++) scanf("%s",str[i]);
for(i=0;i<num;i++){
scanf("%s",cs);
BuildT(pt,cs,i+1);
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
for(k=0;k<8;k++){
BFS(pt,i,j,k);
}
for(i=1;i<=num;i++){
printf("%d %d %c\n",save[i][0],save[i][1],save[i][2]+'A');
}
return 0;
}
http://poj.org/problem?id=2001
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=1005;
char str[NM][25];
struct Node{
Node *next[26];
int cc;
Node(){
for(int i=0;i<26;i++)
next[i]=NULL;
cc=0;
}
};
void BuildT(Node *tree,char *s1)
{
int i,len,t;
len=strlen(s1);
for(i=0;i<len;i++)
{
t=s1[i]-'a';
if(tree->next[t]==NULL)
tree->next[t]=new Node();
tree=tree->next[t];
tree->cc++;
}
}
int SearchT(Node *tree,char *s1)
{
int i,len,t;
len=strlen(s1);
for(i=0;i<len;i++)
{
t=s1[i]-'a';
tree=tree->next[t];
if(tree->cc==1)
return i+1;
}
return len;
}
int main()
{
int num,i,j,k;
k=0;
Node *p=new Node();
while(scanf("%s",str[k])!=EOF)
{
BuildT(p,str[k]);
k++;
}
for(i=0;i<k;i++)
{
num=SearchT(p,str[i]);
printf("%s ",str[i]);
for(j=0;j<num;j++)
printf("%c",str[i][j]);
printf("\n");
}
return 0;
}