Лучший отвечающий
DataGridView. Проверка на заполнение

Вопрос
-
Здравствуйте.
Пишу судоку на 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
6 мая 2013 г. 0:40
Ответы
-
ну код в принцепе можно сократить вот так
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; }
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 8 мая 2013 г. 6:10
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 13 мая 2013 г. 8:15
7 мая 2013 г. 8:29
Все ответы
-
А чем решение в лоб не подходит? Проверять в цикле все яцейки квадрата и если найденно совпадение делать что вам нужно?6 мая 2013 г. 5:06
-
Спасибо Вам, 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(); } }
6 мая 2013 г. 13:12 -
ну код в принцепе можно сократить вот так
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; }
- Предложено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 8 мая 2013 г. 6:10
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 13 мая 2013 г. 8:15
7 мая 2013 г. 8:29 -
Благодарю вас, Brash_O, за уделенное время и ответы.12 мая 2013 г. 23:00