随笔-141  评论-9  文章-3  trackbacks-0
题意:给定一个n*m的字符阵列中,查找给出字串匹配的开始坐标位置, 配置可以是从开始坐标向四周8个方向。

分析:对需要匹配的字串建立trie树,枚举字符阵列的每个位置,每个方向,进行查询。

#include <iostream>

using namespace std;

const int MAX = 90000;
const int M = 26, N = 1005, W=1005;
const int DX[] = -1,-1,  0,  1,  1,  1,  0-1 };
const int DY[] = 0,  1,  1,  1,  0-1-1-1 };
const char D[] = {'A','B','C','D','E','F','G','H'};
int sx,sy;
int n,m,w;
int index;
char puzzles[N][N], word[W];
int r[W][3];

struct Node{
    
int end;
    
struct Node* child[M];
    Node()
{
        end
=-1;
        memset(child,NULL,
sizeof(child));
    }

}
;

Node tree;
Node 
*root = &tree;

void insert( char* s, int d){
    Node 
*node = root;
    
while(*s){
        
if(index==20){
            printf(
" ");
        }

        
if(node->child[*s-'A']==NULL){
            node
->child[*s-'A'= new Node;
        }

        node
=node->child[*s-'A'];
        s
++;
    }

    node
->end = d;
}



void search(int x, int y, int d){
    Node 
*node = root->child[puzzles[x][y]-'A'];

    
if(node==NULL)
        
return;

    
while(node){
        
if(node->end>-1){
            r[node
->end][0= sx;
            r[node
->end][1= sy;
            r[node
->end][2= d;
        }

        x
=x+DX[d];
        y
=y+DY[d];
        
if( x>=0 && x<&& y>=0 && y<m ){
            node
=node->child[puzzles[x][y]-'A'];
        }
else
            
break ;
    }

    
return;
}


void solve(){
    
int i,j,k;
    
for(i=0;i<n;++i)
        
for(j=0;j<m;++j)
            
for(k=0;k<8;++k){
                sx 
= i;
                sy 
= j;
                search(i,j,k);
            }

}



int main(){
    
int i;
    scanf(
"%d%d%d"&n, &m, &w);
    
for(i=0;i<n;++i){
        scanf(
"%s"&puzzles[i]);
    }

    
for(i=0;i<w;++i){
        scanf(
"%s"&word[i]);
        insert(
&word[i],i);
    }


    solve();

    
for(i=0;i<w;++i)
        printf(
"%d %d %c\n", r[i][0], r[i][1], D[r[i][2]]);

    
return 0;
}


posted on 2011-03-16 00:41 小阮 阅读(235) 评论(0)  编辑 收藏 引用 所属分类: 数据结构和算法POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理