poj-1204-Word Puzzles

题目大意:在一个矩阵puzzle中寻找字典中的单词,输出单词的起始位置和方向;
使用trie树,叶子节点中记录方向和起始坐标,通过对每个puzzle中的字母为起始位置进行bfs即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
char puzzle[1050][1050];
struct node
{
bool f;
int next[26];
int d;
int x;int y;
void Init(){f=0;memset(next,-1,sizeof(next));d=9;x=-1;y=-1;};
}a[10000010];
int p=0;
void makeroot()
{
a[p=0].Init();
}
void insert(char* str)
{
int i=0;
int cur=0;
int index=0;
int len=strlen(str);
//cout<<"Insert "<<str<<endl;
for(i=0;i<len;i++)
{
cur=str[i]-'A';
if(a[index].next[cur]==-1)
{
a[++p].Init();
a[index].next[cur]=p;
}
//cout<<"index now : "<<index<<' '<<cur<<endl;
index=a[index].next[cur];
}
//cout<<index<<"!!!!!!!!!!"<<endl;
a[index].f=1;
}
int line,column;
bool in(int x,int y)
{
if(0<=x&&x<line&&y>=0&&y<column)
return 1;
else
return 0;
}
void find(int x,int y,int d)
{
int index=0;
int cur;
int ox;
int oy;
ox=x;
oy=y;
while(in(x,y))
{
cur=puzzle[x][y]-'A';
//cout<<"&&&&&&& "<<x<<' '<<y<<' '<<index<<' '<<char(cur+'A')<<' '<<'%'<<a[index].f<<endl;
if(a[index].f==1)
{
//cout<<"Find one!"<<endl;
a[index].d=d;
a[index].x=ox;
a[index].y=oy;
}
if(a[index].next[cur]==-1)
{
return ;
}


index=a[index].next[cur];
x+=dx[d];
y+=dy[d];
}
if(a[index].f==1)
{
//cout<<"Find one!"<<endl;
a[index].d=d;
a[index].x=ox;
a[index].y=oy;
}

}
int ans(char* str)
{
int index=0;
int cur;
int len=strlen(str);
for(int i=0;i<len;i++)
{
cur=str[i]-'A';

index=a[index].next[cur];
}
//cout<<index<<"$$$$$$$$$$"<<endl;
return index;

}
char ind[1010][1050];
int main()
{
int i=0;
int j=0;
int word;
makeroot();
cin>>line>>column>>word;
for(i=0;i<line;i++)
{
scanf("%s",puzzle[i]);
}
//cout<<"puzzle"<<endl;
for(i=0;i<word;i++)
{
scanf("%s",ind[i]);
//cout<<'&'<<ind[i]<<endl;
insert(ind[i]);
}
//cout<<"step 2"<<endl;
for(i=0;i<line;i++)
{

for(j=0;j<column;j++)
{
for(int k=0;k<8;k++)
{
find(i,j,k);
}
}
}
//find(0,15,6);
//cout<<"step 3"<<endl;
for(i=0;i<word;i++)
{
int key=ans(ind[i]);
printf("%d %d %c\n",a[key].x,a[key].y,a[key].d+'A');
//cout<<a[key].x<<' '<<a[key].y<<' '<<char(a[key].d+'A')<<endl;
}
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值