【发布时间】:2020-02-21 15:09:19
【问题描述】:
我正在为学校做一个 Sudoku-Solving 项目,不知何故,我的两个数组以某种方式链接在一起,当我更改 array1 中的值时,它也会更改 array2 中的值。
请不要因为我的代码风格而讨厌我,一旦完成,我会清理/改进代码。
我已经声明了两个不同的字符串数组变量:
sudokuFields 和 sudokuUnsolved。
我只是更改sudokuFields 的值,而不是sudokuUnsolved 的值,但不知何故,当我调试时,数组总是具有相同的值..
非常欢迎任何帮助。
这是我的代码:
class SudokuAlgorithm
{
public string[,] sudokuFields;
public string[,] sudokuUnsolved;
public bool corectRow;
public bool correctColumn;
public bool correctField;
private static int UNASSIGNED = 0;
public SudokuAlgorithm()
{
sudokuFields = new string[9, 9];
}
public SudokuAlgorithm(string[,] sudoku, int indexRow, int indexColumn)
{
this.sudokuFields = sudoku;
sudokuUnsolved = sudoku;
correctRow = TestRow(indexRow, indexColumn);
correctColumn = TestColumn(indexRow, indexColumn);
correctField = TestArea(indexRow, indexColumn);
SolveSudoku();
}
private void SolveSudoku()
{
for(int i=0;i<9;i++) //Column
{
for(int j=0;j<9;j++) // Row
{
if(SudokuFieldFree(j,i) == true)
{
for(int k=1;k<=9;k++)
{
sudokuFields[i, j] = k.ToString();
if(TestRow(j,i) == false || TestColumn(j,i) == false || TestArea(j,i) == false)
{
sudokuField[i, j] = "";
}
else
{
break;
}
}
if (sudokuFields[i, j] == "")
{
if(j!=0)
{
for(int l =j-1;l>=0;l--)
{
if (SudokuAreaFreeUnsolved(l, i) == true)
{
j = l-1;
sudokuFields[i, l] = "";
break;
}
}
}
else
{
i = i - 1;
j = 8;
}
}
}
}
}
}
private bool SudokuAreaFree(int indexRow, int indexColumn)
{
bool free= false;
if (sudokuFields[indexColumn, indexRow] == "" || sudokuFields[indexColumn, indexRow] == " " || sudokuFields[indexColumn, indexRow] == null)
{
free = true;
return free;
}
return free;
}
private bool SudokuAreaFreeUnsolved(int indexRow, int indexColumn)
{
bool frei = false;
if (sudokuUnsolved[indexColumn, indexRow] == "" || sudokuUnsolved[indexColumn, indexRow] == " " || sudokuUnsolved[indexColumn, indexRow] == null)
{
free= true;
return free;
}
return free;
}
private bool TestRow(int indexRow, int indexColumn)
{
bool valid = true;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (sudokuFields[i, indexRow] == sudokuFields[j, indexRow] && sudokuFields[i, indexRow] != " " && i != j)
{
valid = false;
return valid;
}
}
}
return valid;
}
private bool TestColumn(int indexRow, int indexColumn)
{
bool valid = true;
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (sudokuFields[indexColumn, i] == sudokuFields[indexColumn, j] && sudokuFields[indexColumn, i] != " " && i!=j)
{
valid = false;
return valid;
}
}
}
return valid;
}
private bool TestArea(int indexRow, int indexColumn)
{
bool valid = true;
if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 0 && indexRow <= 2)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 0 && indexRow <= 2)
{
for (int i = 3; i < 6; i++)
{
for (int j = 0; j < 3; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 0 && indexRow <= 2)
{
for (int i = 6; i < 9; i++)
{
for (int j = 0; j < 3; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 3 && indexRow <= 5)
{
for (int i = 0; i < 3; i++)
{
for (int j = 3; j < 6; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 3 && indexRow <= 5)
{
for (int i = 3; i < 6; i++)
{
for (int j = 3; j < 6; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 3 && indexRow <= 5)
{
for (int i = 6; i < 9; i++)
{
for (int j = 3; j < 6; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 0 && indexColumn <= 2 && indexRow >= 6 && indexRow <= 8)
{
for (int i = 0; i < 3; i++)
{
for (int j = 6; j < 9; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 3 && indexColumn <= 5 && indexRow >= 6 && indexRow <= 8)
{
for (int i = 3; i < 6; i++)
{
for (int j = 6; j < 9; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
else if (indexColumn >= 6 && indexColumn <= 8 && indexRow >= 6 && indexRow <= 8)
{
for (int i = 3; i < 6; i++)
{
for (int j = 6; j < 9; j++)
{
if (sudokuFields[indexColumn, indexRow] == sudokuFields[i, j] && sudokuFields[indexColumn, indexRow] != " " && indexColumn != i && indexRow != j)
{
valid = false;
return valid;
}
}
}
}
return valid;
}
}
}
【问题讨论】:
-
您将构造函数数组参数
sudoku分配给两个变量,因此它们指向同一个数组。 -
为了扩展 @JanWichelmann 所说的,C# 数组是引用类型,因此通过将
sudoku分配给两个变量,它们都引用同一个数组。 -
这两个引用都被分配到内存中的相同位置:
this.sudokuFelder = sudoku; sudokuUngeloest = sudoku;。为什么他们不是一样的?