在2d数组中查找数字的位置

时间:2015-01-23 19:13:00

标签: c arrays multidimensional-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.

3 个答案:

答案 0 :(得分:0)

问题不在于语言。你遇到的问题是你需要首先使用算法。

实际上只需查看1D阵列的第一个数字就可以轻松完成。在你的例子中,它是(6,3,3,2)中的6。

  1. 在2D阵列中寻找6个。
  2. 找到6后,使用循环4次循环(因为有4个数字要查找 - (6,3,3,2)。
  3. 在循环中,检查后续数字是否为3,3,2。
  4. 如果是,请返回位置
  5. 否则继续寻找6。
  6. 完成!
  7. 看起来像这样:

    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;
                }
        }
    

答案 1 :(得分:0)

如果您知道如何使用一维数组,那么您也可以像使用多维数组的C那样做!

例如,假设你有一个二维数组:

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

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

(*array)[linear offset]

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

(*array)[6]

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

知道这一点,您可以采用原始算法并使其适应线性方式访问多维数组。这也取代了“环绕”的可能性。

答案 2 :(得分:0)

您可以使用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;
}