POJ1204 - Word Puzzles - 字典树

#include<stdio.h>
#include<string.h>
char map[1005][1005];
char s[1005];
int m,n,t;
int sx,sy;
int div[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//
struct ANS
{
	int x,y;
	char towards;
}ans[1005];
struct tree
{
	tree *next[30];
	int id;
	int time;
	tree()
	{
		id=0;
		for(int i=0;i<30;i++)
		{
			next[i]=NULL;
		}
	}
}*root;
void set(char *s,int t)
{
	tree *item=root;
	int x=strlen(s);
	for(int i=0;i<x;i++)
	{
		int j=s[i]-'A';
		if(item->next[j]==NULL)
		{
			item->next[j]=new tree;
		}
		item=item->next[j];
	}
	item->id=t;
}
void dfs(tree *item,int nx,int ny,int to)
{
	if(item==NULL)
	{
		return ;
	}
	if(item->id>0)
	{
		ans[item->id].x=sx;
		ans[item->id].y=sy;
		ans[item->id].towards=to+'A';
	}
	if(nx<0||ny<0||nx>=n||ny>=m)
	{
		return ;
	}
	dfs(item->next[map[nx][ny]-'A'],nx+div[to][0],ny+div[to][1],to);
}
int main()
{
	int i,j,k;
	scanf("%d%d%d",&n,&m,&t);
	root=new tree;
	for(i=0;i<n;i++)
	{
		scanf("%s",map[i]);
	}
	for(i=1;i<=t;i++)
	{
		scanf("%s",s);
		set(s,i);
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			for(k=0;k<8;k++)
			{
				sx=i;
				sy=j;
				dfs(root,i,j,k);
			}
		}
	}
	for(i=1;i<=t;i++)
	{
		printf("%d %d %c\n",ans[i].x,ans[i].y,ans[i].towards);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值