在二维数组中查找数字的位置

Find location of numbers in 2d array

我有两个数组。数组 A 和数组 B。现在我需要获取数组 B 中数组 A 中的序列所在的位置。我需要获取最后一个号码的位置,但我不知道该怎么做。

A[4]={6,3,3,2};

B[10][18]={
{5,3,6,5,6,1,6,1,4,4,5,4,4,6,3,3,1,3},
{6,2,3,6,3,3,2,4,3,1,5,5,3,4,4,1,6,5},
{6,4,3,1,6,2,2,5,3,4,3,2,6,4,5,5,1,4},
{5,3,5,6,6,4,3,2,6,5,1,2,5,6,5,2,3,1},
{1,2,5,2,6,3,1,5,4,6,4,4,4,2,2,2,3,3},
{4,1,4,2,3,2,3,6,4,1,6,2,3,4,4,1,1,4},
{5,3,3,2,6,2,5,2,3,1,2,6,5,1,6,4,1,3},
{4,5,2,1,2,5,2,6,4,3,3,2,3,3,3,1,5,1},
{1,3,5,5,2,1,3,3,3,1,3,3,6,3,3,3,6,5},
{4,5,2,4,2,3,4,2,5,6,5,2,6,3,5,4,5,2}
};

例如:序列 6,3,3,2 从第二行第四列开始,到第七列结束。我需要得到 2 号的位置。我的结果应该是: 行 = 2, 列= 7

顺序并不总是成行。它可以在列中。例如: 3,2,4,3 我需要知道数字 4 的位置。

我知道如何在一维数组中搜索一个数字,但在这种情况下我没有解决方案。

语言是C.

问题不在于语言。你面临的问题是你需要先把算法搞出来

实际上,只需查看一维数组的第一个数字即可轻松完成此操作。在您的示例中,它是 (6,3,3,2) 中的 6。

  1. 在二维数组中查找 6。
  2. 找到 6 后使用循环 4 次循环(因为有 4 个数字要查找 - (6,3,3,2)。
  3. 在循环中,检查后面的数字是否为3,3,2。
  4. 如果是,return位置
  5. 否则继续查找 6.
  6. 完成!

它看起来像这样:

for(x=0; x<rows; x++)
    for(y=0; y<cols; y++)
    {
        if(matrix[x][y] == array1D[0])
            for(z=1; z<array1DSize; z++){
                if(matrix[x][y] != array1D[z])
                    break;
                location = y;
            }
    }

如果您知道如何处理一维数组,那么您也可以像在 C 中那样处理多维数组!

例如,假设您有一个像这样的二维数组:

int array[5][5]; // 5x5 array of ints

您实际上可以通过以下方式以线性方式访问它:

(*array)[linear offset]

这意味着如果你想访问第 2 行的第 2 列,你可以这样做:

(*array)[6]

因为第二行从索引 5 开始,第二列从索引 1 开始,所以您可以执行 (5+1) 得到 6。同样,第三行将从索引 10 开始,所以如果您想要第三行第二列,你可以做 (10+1).

知道这一点后,您可以采用原始算法并对其进行调整,以线性方式访问多维数组。这也取代了 "wrap around" 的可能性。

您可以使用 memcmp 比较块:

for (i = 0; i < rows; i++) { /* For each row */ 
    for (j = 0; j < cols - size; j++) { /* For each col until cols - 4 */
        if (memcmp(A, &B[i][j], sizeof(A)) == 0) { /* Compare entire block */

#include <stdio.h>
#include <string.h>

int main(void)
{
    int A[4] = {6,3,3,2};
    int B[10][18] = {
        {5,3,6,5,6,1,6,1,4,4,5,4,4,6,3,3,1,3},
        {6,2,3,6,3,3,2,4,3,1,5,5,3,4,4,1,6,5},
        {6,4,3,1,6,2,2,5,3,4,3,2,6,4,5,5,1,4},
        {5,3,5,6,6,4,3,2,6,5,1,2,5,6,5,2,3,1},
        {1,2,5,2,6,3,1,5,4,6,4,4,4,2,2,2,3,3},
        {4,1,4,2,3,2,3,6,4,1,6,2,3,4,4,1,1,4},
        {5,3,3,2,6,2,5,2,3,1,2,6,5,1,6,4,1,3},
        {4,5,2,1,2,5,2,6,4,3,3,2,3,3,3,1,5,1},
        {1,3,5,5,2,1,3,3,3,1,3,3,6,3,3,3,6,5},
        {4,5,2,4,2,3,4,2,5,6,5,2,6,3,5,4,5,2}
    };
    size_t i, j, size, rows, cols;
    int founded = 0;

    size = sizeof(A) / sizeof(A[0]);    
    rows = sizeof(B) / sizeof(B[0]);
    cols = sizeof(B[0]) / sizeof(B[0][0]);
    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols - size; j++) {
            if (memcmp(A, &B[i][j], sizeof(A)) == 0) {
                founded = 1;
                break;
            }
        }
        if (founded) break;
    }
    if (founded) printf("Row: %zu Col: %zu\n", i + 1, j + size);
    return 0;
}