假设你的棋盘是一个二维数组:cells,类型int[9, 9]
static Tuple<bool, string> Solve()
{
steps = 0;
while (!IsSuccessfull())
{
var bl = TrySolveInAStep();
if (!bl)
{
return new Tuple<bool, string>(false, "无解,共花了" + steps + "步");
}
}
return new Tuple<bool, string>(true, null);
}
static bool TrySolveInAStep()
{
steps++;
for (var j = 0; j < 9; j++)
{
for (var i = 0; i < 9; i++)
{
if (cells[i, j] != 0)
continue;
var res = SolveSingleCell(i, j);
if (res.Item1)
{
cells[i, j] = res.Item2;
return true;
}
}
}
return false;
}
static Tuple<bool, int> SolveSingleCell(int x, int y)
{
var hasFoundAFitNum = false;
var lastFitNum = 0;
for (var i = 1; i <= 9; i++)
{
var bl = IsANumFitInACell(x, y, i);
if (hasFoundAFitNum)
{
if (bl)
{
return new Tuple<bool, int>(false, 0);
}
}
else
{
if (bl)
{
hasFoundAFitNum = true;
lastFitNum = i;
}
}
}
return new Tuple<bool, int>(hasFoundAFitNum, lastFitNum);
}
static bool IsANumFitInACell(int x, int y, int num)
{
for (var j = 0; j < 9; j++)
{
if (j == y)
{
continue;
}
if (cells[x, j] == 0)
{
continue;
}
if (cells[x, j] == num)
{
return false;
}
}
for (var i = 0; i < 9; i++)
{
if (i == x)
{
continue;
}
if (cells[i, y] == 0)
{
continue;
}
if (cells[i, y] == num)
{
return false;
}
}
var xInBigCell = x - x % 3;
var yInBigCell = y - y % 3;
for (var j = 0; j < 3; j++)
{
for (var i = 0; i < 3; i++)
{
var _x = xInBigCell + i;
var _y = yInBigCell + j;
if (x == _x && y == _y)
{
continue;
}
if (cells[_x, _y] == 0)
{
continue;
}
if (cells[_x, _y] == num)
{
return false;
}
}
}
return true;
}
static bool IsSuccessfull()
{
for (var j = 0; j < 9; j++)
{
for (var i = 0; i < 9; i++)
{
if (cells[i, j] == 0)
{
return false;
}
}
}
return true;
}
这个算法只能解具有唯一解的数独