| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
居然AC,虽然用时和内存都很大,但对我这种菜鸟来说,做出这个题还是很不容易的,只是,其实其实还是有个小地方不解,再看看代码。
另外, trie数组的大小到底怎么确定,我是开大数组的。
int trie[?][27];前面那个?最大会是多少呢?
附,代码如下
#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
using namespace std;
int trie[100010][28];
int index[100010];
char table[1010][1010];//这两个为输入
//char word[1010][1010];
string word;
int LL[1010],CC[1010];//这三个记录结果
char dir[1010];
int L,C,W;
int row[8]={-1,-1,0,1,1,1,0,-1},col[8]={0,1,1,1,0,-1,-1,-1};
int main()
{
scanf("%d%d%d",&L,&C,&W);
for(int i=0;i<L;++i)
scanf("%s",table[i]);
int length=0;
for(int i=0;i<W;++i)
{
cin>>word;
//scanf("%s",word[i]);
int start=0,j=0;
int len=word.length();
while(j!=len)
{
int next=word[j]-'A'+1;
if(trie[start][next]==0)
trie[start][next]=++length;
start=trie[start][next];
++j;
}
// printf("start=%d\n",start);
trie[start][0]=-1;
index[start]=i;
}
// printf("%s\n%s\n",table[5],word);
for(int i=0;i<L;++i)
{
for(int j=0;j<C;++j)
{
for(int d=0;d<8;++d)
{
int start=0;
int r=i,c=j;
// printf("i=%d j=%d dir=%c\n",i,j,d+'A');
do
{
int next=table[r][c]-'A'+1;
start=trie[start][next];
// printf("start=%d\n",start);
if(start==0)
break;
if(trie[start][0]==-1)
{
int k=index[start];
LL[k]=i;
CC[k]=j;
dir[k]='A'+d;
// printf("k=%d %s\n",k,word[k]);
// printf("%d %d %c\n",i,j,'A'+d);
}
r+=row[d];
c+=col[d];
}while(r>=0&&c>=0&&r<L&&c<C);
}
}
}
for(int i=0;i<W;++i)
{
printf("%d %d %c\n",LL[i],CC[i],dir[i]);
}
// system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator