# include & ltcstdio & gt
# include & ltcstring & gt
使用命名空間std
int Array[6][9] =
{
{1,1,0,1,0,0,1,0,0},
{4,1,1,0,0,0,1,4,0},
{4,0,0,1,1,4,4,1,0},
{0,0,0,0,0,1,0,1,0},
{0,0,1,1,4,1,0,1,0},
{0,0,0,0,4,0,0,0,0},
};
int mo[5] = {1,1,4,1,1 };
Bool check_right(int a,int b) //右向
{
int I;
for(I = 0;我& lt5;i++)if(b+I & gt;= 9)返回false
else if (Array[a][b + i]!= mo[i])返回false
返回true
}
Bool check_down(int a,int b) //向下方向
{
int I;
for(I = 0;我& lt5;i++)if(a+I & gt;= 6)返回false
else if (Array[a + i][b]!= mo[i])返回false
返回true
}
Boolcheck _ left _ down (int a,int b)//左下方向
{
int I;
for(I = 0;我& lt5;i++)if(a+I & gt;= 6 | | b-I & lt;0)返回false
else if (Array[a + i][b - i]!= mo[i])返回false
返回true
}
Boolcheck _ right _ down (int a,int b)//右下方向
{
int I;
for(I = 0;我& lt5;i++)if(a+I & gt;= 6 | | b+ I & gt;= 9)返回false
else if (Array[a + i][b + i]!= mo[i])返回false
返回true
}
int main()
{
int i,j;
for(I = 0;我& lt6;i++)
for(j = 0;j & lt9;j++)
{
if (check_right(i,j)) printf("%d %d right\n ",I,j);
if (check_down(i,j)) printf("%d %d down\n ",I,j);
if (check_left_down(i,j)) printf("%d %d left_down\n ",I,j);
if (check_right_down(i,j)) printf("%d %d right_down\n ",I,j);
//因為模板文本是回文,所以只需要匹配四個方向。如果使用任何模板文本,可以另外檢查其余四個方向。
}
返回0;
}
對於壹個龐大的矩陣和較多的模板文本(比如500×500的矩陣,有500個文本),如果需要在短時間內(比如1秒)完成算法,就需要使用後綴自動機。具體來說,這個問題就是trie圖,壹種專門用來處理多字符串匹配的基於後綴有限狀態自動機(後綴DFA)的數據結構。它的構造方法大致是先構造模板。參考源代碼如下:
(這段代碼從控制臺讀入壹個字符矩陣,最大支持1000×1000,最大支持1000個文本。程序將矩陣中每個文本的起始位置和方向輸出到控制臺,用A-H表示八個方向,可用於英特爾奔騰D2.1g處理器上的任何數據。
# include & ltstdio.h & gt
# include & ltstring.h & gt
int n,m,l,totalnode
#定義編號1100
#定義M 1100000
char data[N][N];
char word[N];
typedef結構
{
int後綴,kind
int c[26];
} trieT
trieT trie[M];
typedef結構
{
int a,b;
char oper
} ans _ type
ans _ type ans[N];
int Q[M];
char nowoper
const int thitah[8]={1,1,0,-1,-1,-1,0,1 };
const int thital[8]={0,-1,-1,-1,0,1,1,1 };
void read_data()
{
scanf("%d %d %d%*c ",& ampn & amp;m & amp;l);
int i,j;
for(I = 1;我& lt= n;i++)
{
for(j = 1;j & lt= m;j++) {scanf("%c ",& ampdata[I][j]);data[I][j]-= ' A ';}
scanf(" % * c ");
}
}
void insert(int s,int len)
{
int i,pnt = 1;
for(I = len-1;我& gt=0;我-)
{
if (trie[pnt].c[word[i]]!=0) pnt=trie[pnt]。c[字[I]];
其他
{
total node++;
trie[pnt]。c[word[I]]= total node;
pnt = totalnode
trie[pnt]。kind =-1;trie[pnt]。後綴= 0;
memset(trie[pnt].c,0,sizeof(trie[pnt].c));
}
}
trie[pnt]。kind = s;
}
void初始化()
{
total node = 1;
trie[1]。kind =-1;trie[1]。後綴= 1;
memset(trie[1]。c,0,sizeof(trie[1]。c));
int i,j,len
for(I = 1;我& lt= l;i++)
{
scanf("%s ",& ampword);
len = strlen(word);
for(j = 0;j & ltlenj++)字[j]-= ' A ';
插入(I,len);
}
}
void make_trie_graph()
{
int i,temp,tempnode,cl,op;
cl = 0;op = 0;
for(I = 0;我& lt26;i++) if (trie[1]。c[i]!=0)
{
temp=trie[1]。c[I];
溫度。後綴= 1;
if (trie[temp].kind==-1) trie[temp]。kind=trie[1]。善良;
q[++ op]= temp;
}else trie[1]。c[I]= 1;
while(cl & lt;op)
{
tempnode = Q[++cl];
for(I = 0;我& lt26;i++) if (trie[tempnode]。c[i]!=0)
{
temp=trie[tempnode]。c[I];
溫度。後綴=trie[trie[tempnode]。後綴】。c[I];
if (trie[temp].kind==-1) trie[temp]。kind=trie[trie[temp]。後綴】。善良;
q[++ op]= temp;
}else trie[tempnode]。c[i]=trie[trie[tempnode]。後綴】。c[I];
}
}
void get_ans(int s,int h,int l)
{
while (trie[s]。善良!=-1)
{
ans[trie]s。善良】。a = h;ans[trie]s。善良】。b = l;
ans[trie]s。善良】。oper = nowoper
s=trie[s]。後綴;
}
}
無效檢查(整數h,整數l)
{
int pnt = 1;
while((h & gt;0)& amp;& amp(h & lt= n)& amp;& amp(l & gt0)& amp;& amp(l & lt=m))
{
pnt=trie[pnt]。c[data[h][l]];
if (trie[pnt].善良!=-1) get_ans(pnt,h,l);
h+= thitah[now oper];l+= thital[now oper];
}
}
void work_ans()
{
int I;
nooper = 0;for(I = 1;我& lt= m;i++) check(1,I);
nooper = 1;for(I = 1;我& lt= m;i++) check(1,I);for(I = 2;我& lt= n;i++) check(i,m);
nooper = 2;for(I = 1;我& lt= n;i++) check(i,m);
nooper = 3;for(I = 1;我& lt= n;i++) check(i,m);for(I = 1;我& ltm;i++) check(n,I);
nooper = 4;for(I = 1;我& lt= m;i++) check(n,I);
nooper = 5;for(I = 1;我& lt= m;i++) check(n,I);for(I = 1;我& ltn;i++) check(i,1);
nooper = 6;for(I = 1;我& lt= n;i++) check(i,1);
nooper = 7;for(I = 1;我& lt= n;i++) check(i,1);for(I = 2;我& lt= m;i++) check(1,I);
}
void顯示_ans()
{
int I;
for(I = 1;我& lt= l;i++) printf("%d %d %c\n ",ans[i]。a-1,ans[i]。b-1,ans[i]。oper+' A ');
}
int main()
{
read _ data();
init();
make _ trie _ graph();
work _ ans();
show _ ans();
返回0;
}
如果樓主想學習trie圖的具體理論和構造方法,可以回復註明。