pku 1204 Word Puzzles
建立好待搜索的字符串,然后八方向遍历那个字母框
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 1003
typedef struct TrieNode
{
TrieNode()
{
end=-1;
memset(next,NULL,sizeof(next));
}
int end;
TrieNode *next[26];
}*Trie;
struct AnsNode
{
int x,y;
char ch;
}ans[MAXSIZE];
const int dir[8][2]= {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int ansx,ansy,k,L,C;
char target[MAXSIZE],map[MAXSIZE][MAXSIZE];
void insert(Trie T,char *str,int idx)
{
while(*str)
{
int i=*str-'A';
if( !T->next[i] ) T->next[i]=new TrieNode;
T=T->next[i];
str++;
}
T->end=idx;
}
void destroy(Trie &T)
{
if(!T) return;
for(int i=0;i<26;i++)
destroy(T->next[i]);
delete T;
T=NULL;
}
void search(Trie T,int x,int y)
{
if(!T) return;
if( T->end != -1)
{
ans[ T->end ].x=ansx;
ans[ T->end ].y=ansy;
ans[ T->end ].ch=(char)('A'+k);
}
if( x<0 || y<0 || x>=L || y>=C) return;
search( T->next[ map[x][y]-'A' ], x+dir[k][0], y+dir[k][1]);
}
void solve(Trie T,int n)
{
int i,j;
for(i=0; i<L; i++)
{
for(j=0; j<C; j++)
{
for(k=0; k<8; k++)
{
ansx=i;
ansy=j;
search(T,i,j);
}
}
}
for(i=0;i<n;i++)
{
printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].ch);
}
}
int main()
{
int i,k,w;
while(scanf("%d %d %d",&L,&C,&w)!=EOF)
{
Trie tree=new TrieNode;
for(i=0; i<L; i++) scanf("%s",map[i]);
for(k=0;k<w;k++)
{
scanf("%s",target);
insert(tree,target,k);
}
solve(tree,w);
// destroy(tree);
}
return 0;
}
浙公网安备 33010602011771号