zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    CF580B Kefa and Company 尺取法
    [USACO08OCT]牧场散步Pasture Walking BZOJ1602 LCA
    [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579
    [USACO09OPEN]牛的数字游戏Cow Digit Game 博弈
    Codeforces 628F 最大流转最小割
    Codeforces 513D2 Constrained Tree
    Codeforces 1009G Allowed Letters 最大流转最小割 sosdp
    Codeforces 431E Chemistry Experiment 线段树 + 二分
    Codeforces 359E Neatness
    Codeforces 1045B Space Isaac
  • 原文地址:https://www.cnblogs.com/nanke/p/2045865.html
Copyright © 2011-2022 走看看