检查两个数组是否相等:返回不正确的结果

本文关键字:返回 不正确 结果 是否 数组 两个 检查 | 更新日期: 2023-09-27 18:37:10

我正在尝试检查两个大小相等的数组是否在相同的索引中包含相同的整数。如果某些元素不相等,我想返回true,否则返回false

public bool multipleSolutions(int[,] grid)
{
    int[,] front = new int[9, 9];
    front = grid;
    int[,] back = new int[9, 9];
    back = grid;
    front = solve(front);
    back = solveBackwards(back);
    for (int r = 0; r < 9; r++)
    {
        for (int c = 0; c < 9; c++)
        {
            if (back[r, c] != front[r, c])
            {
                return true;
            }
        }
    }
    return false;
}

单独测试时,solvesolveBackwards 给出两个不同的数组,但当我尝试multipleSolutions时,它仍然给了我false(因为它们是两个不同的数组,我希望它返回 true )。

检查两个数组是否相等:返回不正确的结果

由于测试逻辑是正确的,因此此错误的最可能原因是 solvesolvebackwards 的实现更改了传入的数组并返回相同的数组。

对于求解和向后求解的调用,将传入由参数网格标识的数组。因此,如果 solve 更改传入的数组,则 solveBackwards 的输入已更改为第一次运行。这可能会影响解决向后。结果不会有所不同,因为在上述假设下,当 solveBackwards 完成时。然后,正面和背面都将是求解的结果向后

假设

  • 解和求解向后更改传入的数组
  • 解和求解的返回值是传入的数组

编辑看到假设是正确的,您可以将其作为求解和求解的第一行向后插入

var temp = new int[9,9]
Array.Copy(grid, 0, temp, 0, grid.Length);

然后通过实现求解和向后求解来使用 temp。

或者,您可以在将它们作为参数传入之前对 Front 和 Back 执行相同的操作

但是,您应该更改这两种方法的返回类型。指定返回类型表示返回不同的对象,而不是改变参数。这也是为什么我更喜欢第一个选项(在方法中复制数组)

然而,在我看来更好的是迭代输入数组并用结果构造一个不可更改的

问题是您将grid数组同时放在frontback变量中。当您将数组连接到数组变量时,它不会将数据从一个数组复制到另一个数组,而是复制对数组对象的引用。所有引用最终都将指向同一个数组对象。

若要将数据从一个数组复制到另一个数组,可以使用 Copy 方法:

int[,] front = new int[9, 9];
Array.Copy(grid, front, grid.Length);
int[,] back = new int[9, 9];
Array.Copy(grid, back, grid.Length);

现在,您有两个新的数组对象,其中包含原始网格中的数据。