-3

我正在尝试检查两个大小相等的数组是否在相同的索引处包含相同的整数。如果某些元素不相等,我想返回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)。

4

2 回答 2

1

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

对于solve和solveBackwards的调用,由参数grid标识的数组被传入。因此,如果solve改变了传入的数组,那么solveBackwards的输入已经根据第一次运行而改变。这可能会影响solveBackwards。结果不会有所不同,因为在完成solveBackwards时根据上述假设。前后都是solveBackwards的结果

假设

  • solve 和 solveBackwards 改变传入的数组
  • solve和solveBacrwards的返回值是传入的数组

编辑 看到假设是正确的,您可以将其作为第一行插入到solve和solveBackwards中

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

然后通过执行solve和solvebackwards来使用temp。

或者,您可以在将它们作为参数传递之前对正面和背面执行相同的操作

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

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

于 2013-10-28T11:04:34.757 回答
-1

问题是您将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);

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

于 2013-10-28T11:18:19.267 回答