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;
}
posted @ 2011-05-13 21:48  枕边梦  阅读(158)  评论(0编辑  收藏  举报