c - 在 C 中快速/高效地识别两个二维数组的相同性

标签 c arrays comparison heuristics sliding-tile-puzzle

我正在研究一个搜索算法项目,寻找 16 谜题的解决方案。

我有两个包含二维数组的结构列表 board[N]​​[N]

列表中的数字在 0-15 范围内是唯一的,区别在于它们的顺序。

BoardA = 0  1  2  3           BoardB = 4  1  2  3  
         4  5  6  7                    0  5  6  7
         8  9 10 11                    8  9 10 11
        12 13 14 15                   12 13 14 15

如您所见,图板之间的唯一区别是数字的顺序。 显然,可以遍历每个板检查是否

BoardA[i][j] == BoardB[i][j]

但是,如果列表中有数百或数千个板,则不希望以这种方式进行比较。

有没有办法快速或有效地比较两个板的相同性?

最佳答案

二维数组的元素位于一个连续的内存块中。所以要比较两个数组,你只是在比较两个内存块。最快的方法是使用 memcmp()。您没有指定每个数组元素的类型,所以我将使用 int,如果您的元素不是 int,您可以将其替换为其他类型。

if (memcmp(BoardA, BoardB, sizeof(int) * N * N) == 0) {
  /* equal */
} else {
  not /* equal */
}

关于c - 在 C 中快速/高效地识别两个二维数组的相同性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024532/

相关文章:

c++ - 我如何在 GTK 中获得键盘和鼠标输入?

c - 为什么单步执行代码时 printf 输出没有立即出现?

C编程: get the size of a two-dimensional pointer to arrays

java - int 与 long 比较会损害 Java 的性能吗?

python - 比较字符串中字符的出现次数

C链表使用tail在末尾插入节点

c - 为什么我从 scanf 中收到段错误(核心转储)?

java - Json解析异常: unable to find value in json array

javascript - 一组字符串 JavaScript 中最长的公共(public)子字符串

android - Android 开发与 iOS 开发相比如何体验 iOS 开发?