生成随机拉丁方连续循环



我正在编写一个生成随机网格、拉丁正方形和数独的程序。我在拉丁方块上工作,除了我在一个连续的循环中,几乎所有的东西都在工作。如果我把它们拆散,它们会很好用。可能是我做错了什么小事情,但我找不到。你能发现哪里出了问题吗?

编辑:对于那些不知道拉丁方是什么的人(如果有人不知道的话),它通常是一个9x9的网格,在行或列中都没有重复。

更新:在if(notSame)语句之前,我发现了notSame等于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;
          }
      }
   }
}

我使用的是一个叫做网格的二维数组。

我不知道你的编码错误在哪里。但你的算法不是很有效。

拉丁方块和数独实际上都是"图形着色"问题的特例。也就是说,给定一堆任意"连接"在一起的"节点",找到一种方法给每个节点上色,这样连接的两个节点就不会有相同的颜色。

这个问题通常很难快速解决,但对于数独和拉丁方块的特定情况,它非常简单,可以在C#中轻松完成。您创建了一个具有81个节点的"图",每个节点都"连接"到其行和列中的其他节点。"颜色"是数字1到9。

在我的五部分系列文章中,我将向您介绍如何创建一种高效的图形着色算法来解决数独问题。将算法调整为生成数独并不困难。

http://blogs.msdn.com/b/ericlippert/archive/tags/graph+着色/

我的问题是在检查行时有一个额外的计数。计数总是超过50,因此会导致无限循环。澄清:

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;
    }

计数++会增加,有时会达到>=50,然后会出现以下代码:

 else if (notSame == false && count > 50)
      {
           count = 0;
           col = 0;
           row = 0;
           break;
      }

这将导致所有内容都设置回0并重新启动。因此,它引起了一个无限循环。谢谢大家的帮助!

我认为生成拉丁正方形的最简单方法是从已知的拉丁正方形开始。说:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

它很容易通过行的循环排列为任何大小生成,然后简单地将网格(1,2,3,4)中的每个值分配给另一个随机生成的值。例如,您可以简单地打乱数字1,2,3,4的列表,然后得到2,4,3,1。现在只需将方块中的1替换为洗牌列表中的第一个条目,将2替换为第二个条目,依此类推即可:

2 4 3 1
4 3 1 2
3 1 2 4 
1 2 4 3

现在,如果您愿意,也可以打乱行(和/或列)的顺序,并且它应该仍然有效。

编辑:实际上,考虑到这一点,从第一个正方形开始,然后打乱列和行可能是最简单的。不需要做替换部分。

对正在迭代的变量进行显式递减,这可能是你的问题。这听起来是一个使用回溯来避免它的好地方:)

编辑:我看到了很多我不知道从哪里开始的问题。这个算法永远不会给你所需要的。首先,当你开始填充它时,它可能会导致死锁问题,而且你无法向特定的行/列添加数字。。假设第5行有12345,第6列有数字6 7 8 9……嗯,你不能在第5行第6列添加数字;)看到问题了吗??除此之外,您的代码还有几个问题:在迭代过程中更改迭代变量是一个大问题,应该避免。

once-notSame=false;那么在你执行死刑的剩余时间里,它会一直保持这种状态。

列是垂直的,行是水平的,所以这(1,2)是第1行第2列。你在第一阶段检查行。。和第二列。。

// if bool = true loop to check columns for repeats
     if (notSame)
     {
         for (int r = 0; r < row; r++)
         {
             // if repeat then genereate new random and go back row
             if (grid[row, col] == grid[r , col])
             {
                 grid[row, col] = rnd.Next(1, 10);

这本身就有问题。。如果你在那里换了号码,你应该和以前一样接受检查!

告诉你老师到这儿来读这篇文章。。我不知道还有什么可以帮助你的,这个算法完全错误,需要进行全面重构(是的,你可以使用迭代来完成,但不是for,你需要使用while和flags)。

相关内容

  • 没有找到相关文章

最新更新