POJ 1204 Word Puzzles [ Trie树 模板题]

题意:

从一个字母表里面找出目标字符串。


思路:

很裸的字典树。


#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Abs(a) ((a)>0?(a):(-(a)))
#define llong long long int
using namespace std;
const int N=1005;
const int inf=(1<<30);
int n,m,w;
char a[N][N];
char word[N][N];
bool vis[N];
int ans[N][3];
int mx[8]={0,1,1,1,0,-1,-1,-1};
int my[8]={-1,-1,0,1,1,1,0,-1};
struct Trie
{
	int end;
	Trie * next[26];
	Trie()
	{
		end=-1;
		memset(next,0,sizeof(next));
	}
};
Trie * root =new Trie;
void Trie_insert(Trie * t,char * s,int index)
{
	if(*s!='\0')
	{
		if(t->next[*s-'A']==0)
		{
			t->next[*s-'A']=new Trie;
		}
		Trie_insert(t->next[*s-'A'],s+1,index);
	}
	else
	{
		t->end=index;
	}
}
void Trie_search(Trie * t,int ox,int oy,int x,int y,int k)
{
	if(!t)
	{
		return;
	}
	if(t->end!=-1&&!vis[t->end])
	{
		vis[t->end]=true;
		ans[t->end][0]=oy;
		ans[t->end][1]=ox;
		ans[t->end][2]=k;
	}
	if(y<0||x<0||y>=n||x>=m)
	  return;
	Trie_search(t->next[a[y][x]-'A'],ox,oy,x+mx[k],y+my[k],k);
}
/*void Trie_print(Trie * t)
{
	if(t->end!=-1)
	{
		printf(" %d\n",t->end);
		return;
	}
	for(int i=0;i<26;i++)
	{
		if(t->next[i]!=NULL)
		{
			printf("%c",i+'A');
			Trie_print(t->next[i]);
		}
	}
}*/
void solve()
{
	for(int i=0;i<n;i++)
	  for(int j=0;j<m;j++)
	  {
		  for(int k=0;k<8;k++)
		  {
			  Trie_search(root,j,i,j,i,k);
		  }
	  }
	for(int i=1;i<=w;i++)
	  printf("%d %d %c\n",ans[i][0],ans[i][1],ans[i][2]+'A');
}
int main()
{
	scanf("%d%d%d",&n,&m,&w);
	for(int i=0;i<n;i++)
	{
		scanf("%s",a[i]);
	}
	for(int i=1;i<=w;i++)
	{
		scanf("%s",word[i]);
		Trie_insert(root,word[i],i);
	}
	solve();
	return 0;
}


你可能感兴趣的:(POJ 1204 Word Puzzles [ Trie树 模板题])