當前位置:成語大全網 - 書法字典 - 關於二維數組求算法

關於二維數組求算法

如果只是針對小至6×9的矩陣,可以直接循環尋找各個方向的匹配。源代碼如下:

# 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圖的具體理論和構造方法,可以回復註明。