2D array 3x9 matrix 获取当前索引的下两个元素的索引并检查它是否等于0

2D array 3x9 matrix get the index of the next two elements of the current index and check if it is equal to 0

我完全是编程新手,我一直在关注一些与 housie ticket 相关的数组教程 generator.The 我卡住的地方是,我必须检查 3x9 的每一行和每一行矩阵不应该有更多的两个空单元格,或者每个单元格旁边填充的单元格不能超过两个 other.I 我正在将随机数放在数组上并尝试验证规则,但是程序崩溃了。有人可以给我一个想法吗?

这是我试过的。

for(int columnIndex=0;columnIndex<=6;columnIndex++)
          {
              if(game[i,columnIndex+2]!=0)
              {
                  return -1;
              }
          }

这就是全部代码

using System;

namespace HelloWorld
{
  class Program
  {
      public static void Main (String[] args)
        {
            for(int times=0;times<2;times++)
            {
                startGame();
                Console.WriteLine("******************************************************************");
            }
            
        }

         private static void startGame()
        {
            int[,] game = new int[3, 9];
            int occupancyLimit = 15;

            while (occupancyLimit > 0)
            {
                int i = getRandomNumber(3);
                int j = getRandomNumber(9);
                //Console.Write(i);
                //Console.Write(j);
                // Console.Write(game[i,j]+" ");
                int data = validateAndReturnNumber(i, j, game);
            
                if (data>0)
                {
                    game[i, j] = data;
                    occupancyLimit--;
                    //Console.WriteLine(game[i,j]);
                }

            }
         for (int i = 0; i < game.GetLength(0); i++)
        {
            for (int j = 0; j < game.GetLength(1); j++)
            {
                Console.Write(game[i,j] + "\t");
            }
            Console.WriteLine();
        }
           
        } 

     
        private static  int validateAndReturnNumber(int i, int j, int[,] game)
        {
            //do not override existing elements in array
            if (game[i,j] != 0)
            {
                return -1;
            }
            //column cannot have more then two elements
            int columncounter = 0;
            for(int c=0;c<3;c++)
            {
                if(game[c,j]!=0)
                {
                    columncounter++;
                }
            }
            if(columncounter>=2)
            {
                return -1;
            }
/*
            //rows cannot have more then two cells filled in and 
            //rows cannot have more then two empty cells
          for(int columnIndex=0;columnIndex<=6;columnIndex++)
          {
              if(game[i,columnIndex+2]!=0)
              {
                  return -1;
              }
          }
     */      
            // rows cannot have more then 5 elements
            int rowcounter = 0;
            for(int r=0;r<9;r++)
            {     
                if(game[i,r]!=0)
                {       
                    rowcounter++;
                }
                
            }
            //Applying, rows cannot have more then 5 elements
            if(rowcounter>=5)
            {
                return -1;
            }

            //return getRandomNumberForColumn(j);
            int data = 0;
            Boolean isValueSet = false;
            do
            {
                data = getRandomNumberForColumn(j);
                isValueSet = isValueExistsInCol(game, i, j, data);
            } while (isValueSet);
            return data;
        }

        private static bool isValueExistsInCol(int[,] game, int i, int j, int data)
        {
            Boolean status = false;
            for(int k=0;k<3;k++)
            {
                if(game[k,j]==data)
                {
                    status = true;
                    break;
                }
            }
            return status;
        }

        private static int getRandomNumberForColumn(int high)
        {
          if(high==0)
            {
                high = 10;

            }
            else
            {
                high=(high + 1) * 10;
            }
            int low = high - 9;
            Random random = new Random();
            return random.Next(high-low)+low;
        }

        private static int getRandomNumber(int max)
        {
            Random random = new Random();
            int num=random.Next(max);
            return (num);
            
        }
    }
}

为什么你的 for 循环不起作用:

for (int columnIndex = 0; columnIndex <= 6; columnIndex++)
{
  if (game[i, columnIndex + 2] != 0)
  {
    return -1;
  }
}

这个循环不考虑j。它正在测试之前添加的数字,一旦之前的数字未通过此测试,它将无限期失败。这会创建一个无限循环。如果数字放在 1 之后的任何位置,此循环也会失败,而它需要填充 5 个位置才能成功。这在数学上是不可能的。

这个: 'should not have more the two empty cells or it cannot have more then two cells' 在数学上也是不可能的。一排9不能同时有少于2个满的和少于2个空的。

我想你是连续2个空的或满的。对于连续两个空的测试无法实现,因为它开始是空的,并且您在填充它之前正在测试它。幸运的是,这是一个冗余测试,基于所有其他测试用例,它始终为真。

连续不超过 2 个完整是可能的,但也可能导致不可能的情况。如果在 1000 次猜测后仍未找到解决方案,我添加了一个重置​​场景的检查。

using System;

namespace HelloWorld
{
    class Program
    {
        public static void Main(String[] args)
        {
            for (int times = 0; times < 2; times++)
            {
                startGame();
                // Console.WriteLine("******************************************************************");
            }

        }

        private static void startGame()
        {
            int iCount = 0;
            int[,] game = new int[3, 9];
            int occupancyLimit = 15;

            while (occupancyLimit > 0)
            {
                int i = getRandomNumber(3);
                int j = getRandomNumber(9);
                //Console.Write(i);
                //Console.Write(j);
                // Console.Write(game[i,j]+" ");
                int data = validateAndReturnNumber(i, j, game);

                if (data > 0)
                {
                    game[i, j] = data;
                    occupancyLimit--;
                    //Console.WriteLine(game[i,j]);
                }
                else
                {
                    iCount++;
                    //Console.WriteLine(iCount);
                    //printGame(game);

                    // If X many fails, retry
                    if(iCount > 1000)
                    {
                        iCount = 0;
                        game = new int[3, 9];
                        occupancyLimit = 15;
                    }
                }

                // If you want to check for zeros you would need to do it here. And use while(true) above
                /*
                if( //Check for zeros)
                {
                    break; // Ends While loop
                }
                else
                {
                    // Reset and try again
                    iCount = 0;
                    game = new int[3, 9];
                    occupancyLimit = 15;
                }
                */
            }

            printGame(game);
        }


        private static void printGame(int[,] game)
        {
            for (int i = 0; i < game.GetLength(0); i++)
            {
                for (int j = 0; j < game.GetLength(1); j++)
                {
                    Console.Write(game[i, j] + "\t");
                }
                Console.WriteLine();
            }
            Console.WriteLine("******************************************************************");
        }


        private static int validateAndReturnNumber(int i, int j, int[,] game)
        {
            //do not override existing elements in array
            if (game[i, j] != 0)
            {
                return -1;
            }
            //column cannot have more then two elements
            int columncounter = 0;
            for (int c = 0; c < 3; c++)
            {
                if (game[c, j] != 0)
                {
                    columncounter++;
                }
            }
            if (columncounter >= 2)
            {
                return -1;
            }

            if(
                (j != 0 && j != 1 && game[i, j - 2] != 0 && game[i, j - 1] != 0) || // 12X 
                (j != 0 && j != 8 && game[i, j - 1] != 0 && game[i, j + 1] != 0) || // 1X3
                (j != 7 && j != 8 && game[i, j + 1] != 0 && game[i, j + 2] != 0)    // X23
               )
            {
                return -1;
            }

            //for (int columnIndex = 0; columnIndex <= 6; columnIndex++)
            //{
            //    if (game[i, columnIndex + 2] != 0)
            //    {
            //        return -1;
            //    }
            //}

            // rows cannot have more then 5 elements
            int rowcounter = 0;
            for (int r = 0; r < 9; r++)
            {
                if (game[i, r] != 0)
                {
                    rowcounter++;
                }

            }
            //Applying, rows cannot have more then 5 elements
            if (rowcounter >= 5)
            {
                return -1;
            }

            //return getRandomNumberForColumn(j);
            int data = 0;
            Boolean isValueSet = false;
            do
            {
                data = getRandomNumberForColumn(j);
                isValueSet = isValueExistsInCol(game, i, j, data);
            } while (isValueSet);
            return data;
        }

        private static bool isValueExistsInCol(int[,] game, int i, int j, int data)
        {
            Boolean status = false;
            for (int k = 0; k < 3; k++)
            {
                if (game[k, j] == data)
                {
                    status = true;
                    break;
                }
            }
            return status;
        }

        private static int getRandomNumberForColumn(int high)
        {
            if (high == 0)
            {
                high = 10;

            }
            else
            {
                high = (high + 1) * 10;
            }
            int low = high - 9;
            Random random = new Random();
            return random.Next(high - low) + low;
        }

        private static int getRandomNumber(int max)
        {
            Random random = new Random();
            int num = random.Next(max);
            return (num);

        }
    }
}

干杯!