none
DataGridView. Проверка на заполнение RRS feed

  • Вопрос

  • Здравствуйте.

    Пишу судоку на VS2010. Нашел как можно сделать проверку по горизонтали и вертикали, чтобы не было одинаковых чисел. А как сделать такую же проверку в квадратах 3х3?

    Заранее спасибо.

    int [,] sudokuField = new int [9,9];
    Random rnd = new Random();
    
     private void AddNumber()
            {
               
                for (int i = 0; i < sudokuField.GetLength(0); i++)
                {
                    int openNumbers = rnd.Next(2, 7);  // Количество чисел открытых на поле
                    for (int j = 0; j <= openNumbers; j++)
                    {
                        int n = rnd.Next(0, 8);//значение номера ячейки, для которой будет произведен
                        //поиск неповторяющегося числа  
                       
                        do
                        {
                            bool findNumber = false;
                            int randomNumber = rnd.Next(1, 10);
    
                            //Проверяет чтобы не было одинаковых значений 
                            //по вертикали и горизонтали(по правилам судоку)
                            for (int x = 0; x < sudokuField.GetLength(0) && !findNumber; x++)
                                if (sudokuField[i, x] == randomNumber) findNumber = true;
                            for (int z = 0; z < sudokuField.GetLength(1) && !findNumber; z++)
                                if (sudokuField[z, n] == randomNumber) findNumber = true;
                           
                            //Если число не найдено, то заполняем ячейку
                            if (!findNumber)
                                sudokuField[i, n] = randomNumber;
                            //Если значение равно нулю, то возможно заполнение ячейки
                        } while (sudokuField[i, n] == 0);
                       
    
                    }
                }
    }


    • Изменено An Bochk 6 мая 2013 г. 0:44

Ответы

  • ну код в принцепе можно сократить вот так

    for (var i = 0; i < 3; i++)
    			{
    				for (var j = 0; j < 3; j++)
    				{
    					for (var k = i*3; k < i*3 + 3; k++)
    					{
    						for (var l = j*3; l < j*3 + 3; l++)
    						{
    							if (masSudoku[k, l] != number) continue;
    							dontrepeate = false;
    						}
    					}
    				}
    			}

    а про то сколько цифр выдавать на выходе это можно рандомно после того как сгенерированно поле пройтись циклом и обнулить лишние например вот так

    for (var j = 0; j < 9; j++)
    				{
    					masSudoku[j , rnd.Next(1, 10)] = 0;
    				}


Все ответы

  • А чем решение в лоб не подходит? Проверять в цикле все яцейки квадрата и если найденно совпадение делать что вам нужно?
  • Спасибо Вам, Brash_O, за ответ.  Но я просто новичок в C# и некоторые моменты мне пока еще не понятны. Если я правильно понимаю, то сделать нужно следующее. И отсюда возникают еще несколько вопросов: можно ли минимизировать этот код и когда заполняется dataGridView на выходе только  9 цифр, а все остальное нули? Что же я делаю не так?

        private void ZapolnenieDG()
            {
                Random rnd = new Random();
                int[,] masSudoku = new int[9, 9];
             
    
                dataGridView1.ColumnCount = masSudoku.GetLength(0);
                dataGridView1.Rows.Add(masSudoku.GetLength(1));
                for (int i = 0; i < masSudoku.GetLength(0); i++)
                    for (int j = 0; j < masSudoku.GetLength(1); j++)
                    {
                        bool dontRepeat = false;
                        int number = rnd.Next(1, 10);
                       
    
                        for (int i1 = 0; i1 <= 2; i1++)
                            for (int j1 = 0; j1 <= 2; j1++)
                                if (masSudoku[i1, j1] == number) dontRepeat = true;
    
                     for (int i2 = 3; i2 <= 5; i2++)
                            for (int j2 = 0; j2 <= 2; j2++)
                                if (masSudoku[i2, j2] == number) dontRepeat = true;
                       for (int i3 = 6; i3 <= 8; i3++)
                           for (int j3 = 0; j3 <= 2; j3++)
                               if (masSudoku[i3, j3] == number) dontRepeat = true;
                     
                        for (int i4 = 0; i4 <= 2; i4++)
                           for (int j4 = 3; j4 <= 5; j4++)
                               if (masSudoku[i4, j4] == number) dontRepeat = true;
    
                       for (int i5 = 3; i5 <= 5; i5++)
                           for (int j5 = 3; j5 <= 5; j5++)
                               if (masSudoku[i5, j5] == number) dontRepeat = true;
                       for (int i6 = 6; i6 <= 8; i6++)
                           for (int j6 = 3; j6 <= 5; j6++)
                               if (masSudoku[i6, j6] == number) dontRepeat = true;
    
                       for (int i7 = 0; i7 <= 2; i7++)
                           for (int j7 = 6; j7 <= 8; j7++)
                               if (masSudoku[i7, j7] == number) dontRepeat = true;
    
                       for (int i8 = 3; i8 <= 5; i8++)
                           for (int j8 = 6; j8 <= 8; j8++)
                               if (masSudoku[i8, j8] == number) dontRepeat = true;
                       for (int i9 = 6; i9 <= 8; i9++)
                           for (int j9 = 6; j9 <= 8; j9++)
                               if (masSudoku[i9, j9] == number) dontRepeat = true; 
    
                        if (!dontRepeat)
                            masSudoku[i, j] = number;
                       
                        dataGridView1[j, i].Value = masSudoku[i, j].ToString();
                    }
                 
            }

  • ну код в принцепе можно сократить вот так

    for (var i = 0; i < 3; i++)
    			{
    				for (var j = 0; j < 3; j++)
    				{
    					for (var k = i*3; k < i*3 + 3; k++)
    					{
    						for (var l = j*3; l < j*3 + 3; l++)
    						{
    							if (masSudoku[k, l] != number) continue;
    							dontrepeate = false;
    						}
    					}
    				}
    			}

    а про то сколько цифр выдавать на выходе это можно рандомно после того как сгенерированно поле пройтись циклом и обнулить лишние например вот так

    for (var j = 0; j < 9; j++)
    				{
    					masSudoku[j , rnd.Next(1, 10)] = 0;
    				}


  • Благодарю вас, Brash_O, за уделенное время и ответы.