格桑花 发表于 2013-1-26 13:38:42

poj-1204-Word Puzzles

题目大意:在一个矩阵puzzle中寻找字典中的单词,输出单词的起始位置和方向;
使用trie树,叶子节点中记录方向和起始坐标,通过对每个puzzle中的字母为起始位置进行bfs即可。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int dx[]={-1,-1,0,1,1,1,0,-1};int dy[]={0,1,1,1,0,-1,-1,-1};char puzzle;struct node{    bool f;    int next;    int d;    int x;int y;    void Init(){f=0;memset(next,-1,sizeof(next));d=9;x=-1;y=-1;};}a;int p=0;void makeroot(){    a.Init();}void insert(char* str){    int i=0;    int cur=0;    int index=0;    int len=strlen(str);    //cout<<"Insert"<<str<<endl;    for(i=0;i<len;i++)    {      cur=str-'A';      if(a.next==-1)      {            a[++p].Init();            a.next=p;      }      //cout<<"index now : "<<index<<' '<<cur<<endl;      index=a.next;    }    //cout<<index<<"!!!!!!!!!!"<<endl;    a.f=1;}int line,column;bool in(int x,int y){    if(0<=x&&x<line&&y>=0&&y<column)      return 1;    else      return 0;}void find(int x,int y,int d){    int index=0;    int cur;    int ox;    int oy;    ox=x;    oy=y;    while(in(x,y))    {      cur=puzzle-'A';      //cout<<"&&&&&&&"<<x<<' '<<y<<' '<<index<<' '<<char(cur+'A')<<' '<<'%'<<a.f<<endl;      if(a.f==1)      {            //cout<<"Find one!"<<endl;            a.d=d;            a.x=ox;            a.y=oy;      }      if(a.next==-1)      {            return ;      }      index=a.next;      x+=dx;      y+=dy;    }    if(a.f==1)      {            //cout<<"Find one!"<<endl;            a.d=d;            a.x=ox;            a.y=oy;      }}int ans(char* str){    int index=0;    int cur;    int len=strlen(str);    for(int i=0;i<len;i++)    {      cur=str-'A';      index=a.next;    }    //cout<<index<<"$$$$$$$$$$"<<endl;    return index;}char ind;int main(){    int i=0;    int j=0;    int word;    makeroot();      cin>>line>>column>>word;    for(i=0;i<line;i++)    {            scanf("%s",puzzle);    }    //cout<<"puzzle"<<endl;    for(i=0;i<word;i++)    {      scanf("%s",ind);      //cout<<'&'<<ind<<endl;      insert(ind);    }    //cout<<"step 2"<<endl;    for(i=0;i<line;i++)    {      for(j=0;j<column;j++)      {            for(int k=0;k<8;k++)            {                find(i,j,k);            }      }    }    //find(0,15,6);    //cout<<"step 3"<<endl;    for(i=0;i<word;i++)    {      int key=ans(ind);      printf("%d %d %c\n",a.x,a.y,a.d+'A');      //cout<<a.x<<' '<<a.y<<' '<<char(a.d+'A')<<endl;    }    return 0;}
页: [1]
查看完整版本: poj-1204-Word Puzzles