【问题标题】:check if array values in 2d array [closed]检查二维数组中的数组值是否[关闭]
【发布时间】:2018-01-20 07:41:50
【问题描述】:

我有一个 C 语言的简单问题,所以,我想检查第二个数组(二维数组)中是否存在数组值,无论值的顺序如何(随机顺序)

例如:

我想检查arr[3]={1,2,3} 中的值是否都存在于mat[3][3]={{1,5,3},{4,5,6},{4,2,5}};

在这种情况下,值存在,因此程序将print ("OK");

注意:我不想重复计算相同的值

【问题讨论】:

  • for (i = 0; i
  • 请在问题中发布您的代码
  • 将 OP 的评论隐藏在答案中:“我想检查 1、2 和 3 在二维数组中是否以随机顺序至少存在 1 次”
  • 原始帖子中的编辑完全改变了问题的含义,使所有现有答案和大多数 cmets 无关紧要。我建议完全删除这个问题。
  • 意思没变现在更清楚了,评论说不明白所以我编辑了

标签: c arrays multidimensional-array


【解决方案1】:

这是一个例子

#include <stdio.h>

int main() {
    int a[3] = {1,2,3};
    int b[3][3] = {{1,5,3},{4,5,6},{4,2,5}};
    int i, j;

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (a[j] != b[i][j]) break;
            if ( j == 2) {
                printf("exists in row %d\n", i);
                return 1;
            }
        }
    }
    printf("does not exists\n");
    return 0;
}

【讨论】:

  • 首先,当您没有检查所有值时为什么会中断以及为什么 j == 2 并没有帮助?
  • @YousufHardan break 存在是因为违反了相等性并且没有理由检查其他元素。 j == 2 因为数组被声明为 3 元素数组,所以 2 是最后一个索引。如果我们之前没有中断,则所有元素的比较都通过了。它逐行检查ba。它不做任何交叉产品。那么,为什么它没有帮助呢?
【解决方案2】:

只需遍历顶层数组。对于其中的每个数组,遍历 that 并将每个元素与您正在搜索的数组中的相应元素进行比较。如果它们都相等,则返回 true。如果到达外部 for 循环的末尾,则返回 false。

编辑:

澄清后,好的。如何制作一个名为“结果”的数组,其大小与您正在搜索的数组相同?将结果数组中的每个值初始化为 0,然后遍历二维数组中的每个元素。如果该元素与搜索词中的某个元素匹配,请将结果数组中的相应值设置为 1。最后,检查您的结果数组。如果其中的每个值都等于 1,则返回 true。否则,返回 false。

【讨论】:

  • “如果它们都相等” - 但是对于应该产生“OK”的示例值,一维数组不会出现。
  • 对,对于他给出的例子,你会返回 false。
  • @WeatherVane 这个问题的表述相当模糊......
  • 对我来说,问题是一维数组中的每个值是否都出现在二维数组的某个位置。
  • no 值的顺序在这里并不重要,我想按随机顺序查找值
【解决方案3】:

仅适用于表 - 需要内存中的连续数据

如果没有找到则返回 0,如果找到则返回 1

int FindVectorInMatrix(int *haystack, int rows, int columns, int *needle, int length) // as described by OP order does not matter
{
    int *tmp;
    int result = 0;
    for (int i = 0; i < length; i++)
    {
        tmp = haystack;
        if (result < i) 
        {
           result = 0;
           break;
        }
        for (int j = 0; j < rows * columns; j++)
        {
            if (*tmp++ == *needle) 
            {
                result++;
                break;
            }
        }
        needle++;
    }
    return !!result;
}

【讨论】:

    【解决方案4】:

    我解决了,谢谢大家,非常感谢您的回答

    #define n 3
        int *p = &vec[0];
    int count1 = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (*p <= vec[2])
            {
                if (*p == mat[i][j])
                {
                    p++;
                    count1++;
                    i=0;
                    j=0;
                }
            }
        }
    }
    
    if(count1 == 3) printf("ok");
    

    【讨论】:

    • 1) i=0; j=0; :这不会使下一次搜索成为热门搜索。 2) *p &lt;= 3 可能发生越界访问。 (另外,要搜索的数组的末尾不应该是一个固定的数字。)
    • 我的朋友,首先我尝试了代码并且它正在工作,其次我让 i=0 和 j=0 再次搜索第二个值,就像我们对第一个值所做的那样
    • 这不会按预期工作。见DEMO
    • 我让 i=0 和 j=0 再次搜索第二个值,就像我们对第一个值所做的那样 请注意,它在末尾递增for循环的.
    • 看,整个代码中重要的是计数的值,再试一次,我相信你会同意我的
    【解决方案5】:

    它很简单,只需遍历您寻找所需值的数组并检查是否退出然后中断。检查这个:

    for(int a=0; a<3; a++)
    {
        int cnt=0;
        for(int b=0;b<3; b++)
        {
            if(mat[a][b]==arr[b])cnt++;
            if(cnt==3){cout<<"ok"; return 0;}
        }
    }
    

    【讨论】:

    • 它的 c 不是 c++
    • 我只是给了他提示。希望OP能理解。
    • 它仍然不完全有效。打印okokNotFound 编辑:我在循环后面添加了NotFound print。
    • 感谢您指出问题。希望最后一次编辑没问题。
    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多