Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2013, 12:22   #1
Serg94
Форумчанин
 
Аватар для Serg94
 
Регистрация: 10.12.2011
Сообщений: 167
По умолчанию Генерирование судоку. C#

Здравствуйте! Программа иногда заполняет половину и зацикливается, а иногда первый квадрат 3х3 и зацикливается. В чем проблема?!
В классе формы объявлены глобальные переменные:
Код:
  int ii = 0, jj = 0;
так же
Код:
  TextBox[,] tb; tb = new TextBox[9, 9];
при клике на кнопку "старт" будет вызвана эта функция, где будут генерироваться наши числа
Код:
 private void стартToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Random r = new Random();
            int n;
            while (true)
            {
                    for (int j = jj; j < jj+3; ++j)
                    {
                         for (int i = ii; i < ii+3; ++i)
                         {
                   
                      loop:  if (generator(n=r.Next(1, 10), i, j))
                                tb[i, j].Text = n.ToString();
                        else
                            goto loop;
                    }
                }
                    MessageBox.Show("Сгенерир  "); // это так, для себя
              
if (ii == 6)
{
    ii = -3;
    jj += 3;
}
ii+=3; // увеличиваем на 3 и заполняем дргой квадрат
if (jj == 9) break;
            }
}
так же функция, где проверяем

Код:
    bool generator(int r_, int i_, int j_)
        {
            
              int k=0;
              for (int g = 0; g < 9; g++) // проверяем есть ли в строке и в столбце такая же цифра
              {
                  if (g != i_)
                      if (tb[g, j_].Text == r_.ToString()) k++;
                  if (g != j_)
                      if (tb[i_, g].Text == r_.ToString())
                          k++;
                  if (k > 0) return false;
              }
                    this.Text = p++.ToString(); // выводим количество попыток
                    if (k == 0) // если все хорошо, пытаемся заполнить квадрат 3х3
                    {
                        for (int j = jj; j < jj + 3; ++j)
                        {
                            for (int i = ii; i < ii + 3; ++i)
                            {

                                if (j != j_ || i_ != i) // этот элемент не проверяем
                                    if (tb[i, j].Text == r_.ToString())
                                        k++;
                            }
                        }
                        if (k == 0)
                            return true;
                        else
                            return false;
                    }
                    else
                        return false; // в принципе это не нужно, но когда сотру это, то ошибка! чего так?
        }
Serg94 вне форума Ответить с цитированием
Старый 30.07.2013, 19:15   #2
Serg94
Форумчанин
 
Аватар для Serg94
 
Регистрация: 10.12.2011
Сообщений: 167
По умолчанию

Решил проблему. Теперь работает как надо!
Serg94 вне форума Ответить с цитированием
Старый 30.07.2013, 19:20   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Решение-то выложите.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 31.07.2013, 13:04   #4
Serg94
Форумчанин
 
Аватар для Serg94
 
Регистрация: 10.12.2011
Сообщений: 167
По умолчанию Ну если кому-то интересно, то..

Код:
 private void стартToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Random r = new Random();
            int n;
            while (true)
            {
            loop1: for (int j = jj; j < jj + 3; ++j)
                {
                    for (int i = ii; i < ii + 3; ++i)
                    {

                    loop: if (generator(n = r.Next(1, 10), i, j))
                        {
                            tb[i, j].Text = n.ToString();
                        }
                        else
                            if (p > 500)
                            {

                                break;
                            }
                            else
                                goto loop;
                    }
                    if (p > 500)
                    {
                        p = 0;
                        clear();
                        if (ii >= 3)
                        {
                            ii -= 3;
                            clear();
                        }
                        goto loop1;
                    }
                }
                if (ii == 6)
                {
                    ii = -3;
                    jj += 3;
                }
                ii += 3; // увеличиваем на 3 и заполняем дргой квадрат
                if (jj == 9)
                {
                    ii = jj = p = 0;
                    break;
                }
            }
    }

Код:
        bool generator(int r_, int i_, int j_)
        {
              int k=0;
              for (int g = 0; g < 9; g++) // проверяем есть ли в строке и в столбце такая же цифра
              {
                  if (g != i_)
                      if (tb[g, j_].Text == r_.ToString()) k++;
                  if (g != j_)
                      if (tb[i_, g].Text == r_.ToString())
                          k++;
                  if (k > 0)
                  {
                      p++; 
                      return false;
                  }
              }
                  
                    p++;
                   
                    if (k == 0) // если все хорошо, пытаемся заполнить квадрат 3х3
                    {
                        for (int j = jj; j < jj + 3; ++j)
                        {
                            for (int i = ii; i < ii + 3; ++i)
                            {

                                if (j != j_ || i_ != i) // этот элемент не проверяем
                                    if (tb[i, j].Text == r_.ToString())
                                        k++;
                            }
                        }
                        if (k == 0)
                            return true;
                        else
                            return false;
                    }
                    else
                        return false; // в принципе это не нужно, но когда сотру это, то ошибка! чего так?
        }
Код:
 void clear()
        {
            for (int j = jj; j < jj + 3; ++j)
            {
                for (int i = ii; i < ii + 3; ++i)
                {
                    tb[i, j].Text = "";
                }
            }
           
        }
Изображения
Тип файла: jpg Снимок.JPG (61.7 Кб, 109 просмотров)

Последний раз редактировалось Serg94; 31.07.2013 в 13:07.
Serg94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
генерирование архива CodeNOT PHP 1 10.06.2013 18:45
Динамическое генерирование формы veter48 PHP 2 23.04.2013 14:07
Переделать обычное судоку в судоку чёт-нечёт Dark Illusion Общие вопросы Delphi 0 28.03.2012 20:33
Генерирование Патрон Общие вопросы Delphi 7 29.03.2008 20:17
генерирование размещений Roman Помощь студентам 2 25.06.2007 12:01