C++程序用于查找网格中是否存在模式

什么是网格?

网格是由许多互相连接的正方形或矩形组成的结构,它们通常用于表示二维或三维空间中的数据。在计算机科学中,网格常用于处理图形、模拟物理过程、计算机辅助设计以及其他各种应用。其中,最常见的是二维网格。

模式查找算法

模式查找是指在给定的数据集中查找指定的模式,例如在一个文本文档中查找一个特定的字符串。这个问题在计算机科学中非常常见,因此有许多有效的算法可以解决它。其中,一种常见的方法是使用KMP算法。

KMP算法

KMP算法是一种快速的字符串匹配算法,其目的是在给定的文本中查找指定的模式。这种算法的关键在于使用前缀函数,即计算出模式的前缀和后缀中共有的最长部分。这个部分可以帮助我们更快地找到匹配的位置。

void KMP(string text, string pattern) {

int n = text.length();

int m = pattern.length();

vector pi(m);

pi[0] = 0;

int j = 0;

for (int i = 1; i < m; i++) {

while (j > 0 && pattern[j] != pattern[i]) {

j = pi[j-1];

}

if (pattern[j] == pattern[i]) {

j++;

}

pi[i] = j;

}

j = 0;

for (int i = 0; i < n; i++) {

while (j > 0 && pattern[j] != text[i]) {

j = pi[j-1];

}

if (pattern[j] == text[i]) {

j++;

}

if (j == m) {

cout << "Found pattern at index " << i-m+1 << endl;

j = pi[j-1];

}

}

}

如何在网格中查找模式?

在网格结构中查找指定的模式问题与在字符串中查找类似。我们可以使用KMP算法来解决这个问题,但是需要对算法进行一些修改,以便处理二维数据结构。这可以通过将网格展开成一维结构来实现。

网格展开

网格展开是指将二维网格映射到一维数组中。这可以通过将每个单元格的坐标映射到数组中的索引来实现。例如,在一个4x4的网格中,单元格(1,2)可以映射到索引6。

对一维数组中的模式进行KMP查找

我们可以将展开后的一维数组作为文本,将要查找的模式作为模式,然后使用KMP算法进行查找。当我们找到一个匹配时,只需将匹配的索引转换回二维坐标即可。

void search(int grid[][COL], int pattern[][PAT_COL]) {

int M = PAT_ROW, N = PAT_COL;

int lps[M];

computeLPS(pattern, M, lps);

for (int i = 0; i <= ROW-M; ) {

int j = 0;

while (j < COL) {

if (grid[i][j] == pattern[0][0]) {

int ii = i, jj = j, k = 0;

while (ii < ROW && jj < COL && k < M

&& grid[ii][jj] == pattern[k][jj-j]) {

ii++;

if (jj-j == N-1) {

jj = j;

k++;

} else {

jj++;

}

}

if (k == M) {

cout << "Pattern found at " << i << ", " << j << endl;

j += lps[M-1];

} else {

if (jj == j) {

jj++;

}

j = jj;

}

} else {

j++;

}

}

i++;

}

}

示例

下面是一个用于查找网格中是否存在模式的C++程序示例。

#include <iostream>

#include <vector>

using namespace std;

#define ROW 5

#define COL 5

#define PAT_ROW 2

#define PAT_COL 2

void computeLPS(int pattern[][PAT_COL], int M, int lps[]) {

int len = 0;

lps[0] = 0;

int i = 1;

while (i < M) {

if (pattern[i][0] == pattern[len][0] &&

pattern[i][1] == pattern[len][1]) {

len++;

lps[i] = len;

i++;

} else {

if (len != 0) {

len = lps[len-1];

} else {

lps[i] = 0;

i++;

}

}

}

}

void search(int grid[][COL], int pattern[][PAT_COL]) {

int M = PAT_ROW, N = PAT_COL;

int lps[M];

computeLPS(pattern, M, lps);

for (int i = 0; i <= ROW-M; ) {

int j = 0;

while (j < COL) {

if (grid[i][j] == pattern[0][0]) {

int ii = i, jj = j, k = 0;

while (ii < ROW && jj < COL && k < M

&& grid[ii][jj] == pattern[k][jj-j]) {

ii++;

if (jj-j == N-1) {

jj = j;

k++;

} else {

jj++;

}

}

if (k == M) {

cout << "Pattern found at " << i << ", " << j << endl;

j += lps[M-1];

} else {

if (jj == j) {

jj++;

}

j = jj;

}

} else {

j++;

}

}

i++;

}

}

int main() {

int grid[ROW][COL] = {

{1, 2, 3, 4, 5},

{6, 7, 8, 9, 0},

{2, 3, 4, 5, 6},

{7, 8, 9, 0, 1},

{3, 4, 5, 6, 7}

};

int pattern[PAT_ROW][PAT_COL] = {

{2, 3},

{8, 9}

};

search(grid, pattern);

return 0;

}

总结

本文介绍了如何使用KMP算法在网格中查找模式。这个问题可以使用与字符串匹配类似的算法来解决,但需要对算法进行一些改进。具体地,我们可以将网格展开为一维数组,并在其上应用KMP算法来查找给定的模式。这个问题具有广泛的应用,例如在图像分析、模式识别以及语音识别中都可以看到类似的技术。

后端开发标签