pku1204 Word Puzzles
这题目其实也不难,要有勇气去写这个代码,额,不过我第一次TLE了,我以为应该会超时的,太小看这个三个循环了
记录下八个方向,本来想一边读入一遍查找的,省得记录结果,不过真的太慢了,所以只好开 一个二维的数组记录咯,
插入的操作基本跟之前的一样,就是查询的时候用递归的方式,这是为了方向看,同时写代码也轻松了许多啦,比较直观
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
node *next[26];
int id;
}*tree,t;
tree root;
int px,py;
char str[1001][1001];
int res[1001][3];
int n,m,w;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//八个方向
void insert(char *s1,int d)
{
tree p=root,newnode;
for(;*s1!='\0';s1++)
{
int i=*s1-'A';
if(p->next[i]!=NULL)
p=p->next[i];
else
{
newnode=(tree)malloc(sizeof(t));
for(int j=0;j<26;j++)
newnode->next[j]=NULL;
newnode->id=-1;
p->next[i]=newnode;
p=newnode;
}
}
p->id=d;
}
void search(tree p,int x,int y,int k)
{
int i=str[x][y]-'A';
if(p==NULL)
return ;
if(p->id>-1)//查找到单词,id同时记录了该单词读入时的查询顺序
{
res[p->id][0]=px;
res[p->id][1]=py;
res[p->id][2]=k;
}
if(x>=n||x<0||y>=m||y<0)
return ;
search(p->next[i],x+dir[k][0],y+dir[k][1],k);//递归查询k方向上的下一个字母
}
void solve()
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
for(k=0;k<8;k++)
{
px=i;//记录起始坐标
py=j;
search(root,i,j,k);
}
}
void input()
{
int i,j;
char sub[1010];
scanf("%d %d %d",&n,&m,&w);
getchar();
for(i=0;i<n;i++)
gets(str[i]);
root=(tree)malloc(sizeof(t));
for(i=0;i<26;i++)
root->next[i]=NULL;
root->id=-1;
for(j=0;j<w;j++)
{
gets(sub);
insert(sub,j);
}
}
void output()
{
for(int i=0;i<w;i++)
printf("%d %d %c\n",res[i][0],res[i][1],res[i][2]+'A');
}
int main()
{
input();
solve();
output();
return 0;
}

浙公网安备 33010602011771号