在二维数组中查找数字的位置
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。
- 在二维数组中查找 6。
- 找到 6 后使用循环 4 次循环(因为有 4 个数字要查找 - (6,3,3,2)。
- 在循环中,检查后面的数字是否为3,3,2。
- 如果是,return位置
- 否则继续查找 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;
}
我有两个数组。数组 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。
- 在二维数组中查找 6。
- 找到 6 后使用循环 4 次循环(因为有 4 个数字要查找 - (6,3,3,2)。
- 在循环中,检查后面的数字是否为3,3,2。
- 如果是,return位置
- 否则继续查找 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;
}