我正在开发一个程序来生成随机网格,拉丁方格和数独。我正在拉丁方工作,除我处于连续循环外,几乎所有工作都在进行。如果我拆开它们,它们就可以正常工作。我可能做错了一些小事,但找不到。您能找出问题所在吗?
编辑:对于那些不知道拉丁广场是什么(如果有人不知道)的人来说,它通常是9x9的网格,在行和列中都没有重复。
更新:我发现if(notSame)语句之前的notSame等于true的问题。它始终等于true,所以不会完成对行的检查。现在,当我运行它时,它不再处于连续循环中,而是行没有重复,但列仍然存在。
更新#2:现在,我为列重新编码了很多代码。我的教授要求我改变一些事情,但这仍然使我陷入不停的循环。
int row = 0, col = 0, count = 0;
bool notSame = true;
// setting up rows and columns
for (row = 0; row < grid.GetLength(0); row++)
{
for (col = 0; col < grid.GetLength(1); col++)
{
grid[row, col] = rnd.Next(1, 10);
//for loop to check rows for repeats
for (int c = 0; c < col; c++)
{
// if there is repeat go back a column and set bool = false
if (grid[row, col] == grid[row, c])
{
col--;
count++;
notSame = false;
break;
}
//notSame = true;
}
// if bool = true loop to check columns for repeats
if (notSame)
{
for (int r = 0; r < row; r++)
{
// if repeat then go back row
if (grid[row, col] == grid[r, col])
{
notSame = false;
count++;
break;
}
}
if (notSame == false && count <= 50)
{
row--;
//break;
}
else if (notSame == false && count > 50)
{
count = 0;
col = 0;
row = 0;
break;
}
}
}
}
我正在使用称为网格的2D数组。
最佳答案
我不知道您的编码错误在哪里。但是您的算法不是很有效。
拉丁方块和数独实际上都是“图形着色”问题的特例。即,给定一堆任意“连接”在一起的“节点”,找到一种为每个节点着色的方法,以使没有两个连接的节点具有相同的颜色。
通常,这个问题很难快速解决,但是对于数独和拉丁方的特定情况,这非常简单,可以在C#中轻松完成。您创建一个具有81个节点的“图形”,并且每个节点都“连接”到其行和列中的其他节点。 “颜色”是数字1到9。
在我的五部分文章系列中,我将引导您如何创建可以解决数独问题的高效图形着色算法。改编算法以生成数独并不困难。
http://blogs.msdn.com/b/ericlippert/archive/tags/graph+colouring/
关于c# - 生成随机拉丁方形连续循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9913139/