我正在开发一个程序来生成随机网格,拉丁方格和数独。我正在拉丁方工作,除我处于连续循环外,几乎所有工作都在进行。如果我拆开它们,它们就可以正常工作。我可能做错了一些小事,但找不到。您能找出问题所在吗?

编辑:对于那些不知道拉丁广场是什么(如果有人不知道)的人来说,它通常是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/

10-09 12:41