您的位置:首页 > 其它

POJ 1204 Word Puzzles(字典树+搜索)

2015-05-14 11:18 417 查看
题意:在一个字符矩阵中找每个给定字符串的匹配起始位置和匹配方向(A到H表示八个方向);

思路:将给定字符串插入字典树中,遍历字符矩阵,在每个字符处向八个方向用字典树找。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct node
{
int num;
node *next[26];
}node;
node *head;
char str[1005][1005],ch[1005][1005];
int n,m,w;
int x,y,direction;
int result[1005][1005];
int dir[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1};
void init(node *h)
{
for(int i=0;i<26;i++)
{
h->next[i]=NULL;
h->num=0;
}
}
void h_insert(char s[],int id)//建树
{
node *t,*s1=head;
int n=strlen(s);
for(int i=0;i<n;i++)
{
int k=s[i]-'A';
if(s1->next[k]==NULL)
{
t=new node;
init(t);
s1->next[k]=t;
}
s1=s1->next[k];
}
s1->num=id;
}
void dfs(node *p,int a,int b,int d)//搜索
{
if(p==NULL) return;

if(p->num>0)
{
result[p->num][0]=x;
result[p->num][1]=y;
result[p->num][2]=d;
}
if(a<0||b<0||a>=n||b>=m) return;//放在后面判断
dfs(p->next[str[a][b]-'A'],a+dir[d][0],b+dir[d][1],d);
}
int main()
{
int i,j,k;
while(scanf("%d%d%d",&n,&m,&w)!=EOF)
{
head=new node;
init(head);
memset(str,0,sizeof(str));
memset(ch,0,sizeof(ch));
memset(result,0,sizeof(result));
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
}
for(i=1;i<=w;i++)
{
scanf("%s",ch[i]);
h_insert(ch[i],i);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
for(k=0;k<8;k++)
{
x=i;y=j;direction=k;
node *p=head;
dfs(p,x,y,direction);
}
}
}
for(i=1;i<=w;i++)
{
printf("%d %d %c\n",result[i][0],result[i][1],result[i][2]+'A');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: