powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перебор не занятых шаров
25 сообщений из 32, страница 1 из 2
Перебор не занятых шаров
    #39700068
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла такая вот алгоритмическая проблема.

Есть 19 коробок. В каждой коробке 19 пронумерованных шаров от 1 до 19.
Скажем начинаем с первой коробки - выбираем там шар номер 2. Во второй коробке я могу выбрать любой шар кроме номер 2.
Скажем выбрал шар номер 3. В третьей коробке я могу выбрать шар только из оставшихся 1,4,5,6,7,8,9,10...и так далее
Проблема как отображать оставшиеся шары на дисплее циклически?

Есть три кнопки ENTER,UP,DOWN.
ENTER выбирает следующую коробку - движение только вверх, вернуться к предыдущей коробке я не могу.
UP, DOWN выбирают следующий доступный шар.
И текущая коробка и выбранный шар отображаются на дисплее.

Я сделал симуляцию на Сшарп

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
byte g_counter;

int box_number;
byte ball_number;

byte[] mslseq = new byte[20];
byte[] selected = new byte[20];

private void Form1_Load(object sender, EventArgs e)
{
           
  ball_number = 1;
  box_number = 0;
  g_counter = 1;

  DisplayText();
}

private void buttonEnter_Click(object sender, EventArgs e)
{  
   if (ball_number < 20)
   {
       mslseq[box_number] = ball_number;
       selected[ball_number] = 1;
   }

   //select next box
   box_number++;

   //find first available ball
    ball_number = GetNextBallNumber(UP_KEY, 1);
    g_counter = ball_number;

    if (box_number > 18)
    {
        box_number = 0;
        textBoxDisplay.Text = "Finished!!!";
    }

    DisplayText();
}


private void buttonUp_Click(object sender, EventArgs e)
{
    g_counter++;
    if (g_counter > 19)
       g_counter = 1;

    ball_number = GetNextBallNumber(UP_KEY, g_counter);
        g_counter = ball_number;

    DisplayText();

}

private void buttonDown_Click(object sender, EventArgs e)
{
    g_counter--;
    if (g_counter > 19)
        g_counter = 19;

    ball_number = GetNextBallNumber(DOWN_KEY, g_counter);
        g_counter = ball_number;

    DisplayText();
}

void DisplayText()
{
   textBoxBox.Text = (box_number + 1).ToString();
   textBoxBall.Text = ball_number.ToString();
}

byte GetNextMissleNumber(int key, byte b_num)
{
   int done = 0;
            
   while (done == 0)
   {
      if (selected[b_num] == 0)
      {
          done = 1;
          return b_num;
      }
      else
      {
          if (key == UP_KEY)
          {
               b_num++;
               if (b_num > 19)
               {
                  done = 1;
                  return 1;  //????
               }
          }
          else if (key == DOWN_KEY)
          {
              b_num--;
              if (b_num > 19) //overflow
              {
                 done = 1;
                 return 19; //????
              }
          }
       }
   }
   return 0;
}



Проблема в переходах 1-19, 19-1.Не получается разрулить логику.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700118
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
Задача не сформулирована.
Покажи, как должно работать, на примере с 4 коробками и шарами.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700123
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

фактически у тебя человек вручную генерирует перестановку,
из этого и исходи при проектировании структуры данных.

После того как человек выбирает i-тый шар,
номер выбранного шара помещаешь на i-тое место, а остальные номера сдвигаешь.
Т.о. у тебя всегда в начале массива будут выбранные номера, в конце - не выбранные.
Ну и останется только закольцевать в UI невыбранные, ты должен справиться.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700165
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут что-то не то. После декремента не принято сравнивать переменную на "больше".
Код: c#
1.
2.
3.
    g_counter--;
    if (g_counter > 19)
           g_counter = 19;
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700180
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, на паскале примерно так (не отлаживал)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//массив шаров
var
  box: array of integer;

//начальное заполнение массива шаров
procedure InitBox(count: integer);
begin;
  SetLength(box, count);
  for i:=0 to count-1 do box[i]:=i;
  end;

//передвинуть положение текущего шара на value=-1..1
function RotateOffset(boxNo, offset, value): integer;
var
  m: integer;
begin;
  m:=Length(box)-boxNo; //количество оставшихся шаров
  Result:=(offset+value+m) mod m;
  end;

//получить номер текущего шара
function GetBall(boxNo, offset): integer;
begin;
  Result:=box[boxNo+offset];
  end;

//выбрать шар (не забыть потом увеличить boxNo)
procedure SwapBalls(boxNo, offset);
var
  b, i: integer;
begin;
  b:=box[boxNo+offset];
  for i:=boxNo+offset-1 downto boxNo do box[i+1]:=box[i];
  box[boxNo]:=b;
  end;
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700205
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если взглянуть на эту задачу с точки зрения задачи расстановки ферзей.

Коробка - это номер ферзя.
Номер шара - значение ферзя.

А далее, выбирая номер коробки и номер шара, определяем расклад (выборку).

Тут и модулярные выборки, и прочие выборки. Всего: 4968057848 выборок.

Кто-то захочет исследовать торовые выборки, а кого-то заинтересует выборка из 50000 коробок, а кто-то обозначит множество алгоритмов по выборкам.

Так что, jenya7, становитесь участником топика "Расстановка ферзей".
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700206
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предыдущее сообщение - первое что пришло на ум.

На самом деле имеем выборку не ферзей, а ладей. И количество выборок будет значительно больше.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy Usov
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700253
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, 2 момента непонятны

1) я могу выбрать шар только из оставшихся
Как понимать? обязательно надо переходить к другой коробке и в ней искать, пока не наткнёшься на новый шар? или достаточно обойтись одной коробкой, тогда и искать не надо.
В последнем случае типичная схема выбора без возврата.

2) разрулить логику перехода
уточнить проблему, остаток от деления на 19 разве не есть логика перехода?
что такое отображать циклически?
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700270
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98jenya7, 2 момента непонятны

1) я могу выбрать шар только из оставшихся
Как понимать? обязательно надо переходить к другой коробке и в ней искать, пока не наткнёшься на новый шар? или достаточно обойтись одной коробкой, тогда и искать не надо.
В последнем случае типичная схема выбора без возврата.

2) разрулить логику перехода
уточнить проблему, остаток от деления на 19 разве не есть логика перехода?
что такое отображать циклически?

Автор затаился)

В меру моего понимания:

1. У него выбор без возврата (причем описание UI мешает описанию алгоритма)

2. Проблема в UI - автор не может изобразить модную нынче "карусель",
когда у пользователя есть возможность выбрать текущий элемент
или сделать текущим его соседа слева/справа (сверху/снизу).
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700277
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksandr SharahovАвтор затаился)

В меру моего понимания:

1. У него выбор без возврата (причем описание UI мешает описанию алгоритма)

2. Проблема в UI - автор не может изобразить модную нынче "карусель",
когда у пользователя есть возможность выбрать текущий элемент
или сделать текущим его соседа слева/справа (сверху/снизу).На самом деле все гораздо проще. Мы не дочитали начальное сообщение до конца. А там:jenya7Проблема в переходах 1-19, 19-1.Не получается разрулить логику.Автор должен показать одну выборку по "логике", и что получилось на печати.
Тогда все станет ясно.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автору еще рано заниматься шахматной задачей. Но в форуме есть пара людей которых я-бы пригласил.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700287
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonАвтору еще рано заниматься шахматной задачей. Но в форуме есть пара людей которых я-бы пригласил.В шахматной задаче почти ничего не осталось от шахмат: модулярность, торы, алгоритомы.

А автор постепенно перестанет называть коробки коробками, и начнет называть их ферзями, и добавит одно (или два) условия.

Так что переход возможен.
Модератор: Просьба обсуждать свою задачу в своем топике. Данный топик о другом.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700290
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Проблема в переходах 1-19, 19-1.Не получается разрулить логику.
ИМХО эти переходы надо запретить.

Например ты выбрал все 19, перешел снова на 1-й и что дальше? Выбирать не из чего, т.к. остальные 18 уже выбраны.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700297
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7Проблема в переходах 1-19, 19-1.Не получается разрулить логику.ИМХО эти переходы надо запретить.
Например ты выбрал все 19, перешел снова на 1-й и что дальше? Выбирать не из чего, т.к. остальные 18 уже выбраны.Выбраны не остальные шары (18), а шары первой выборки.

А что делать с остальными шарами: 18 х 19?

Наверное, продолжать дальше выбирать (пока автор молчит). Ведь нигде не указано, что только одна выборка.
И так до обеда...
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700299
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tjenya7Проблема в переходах 1-19, 19-1.Не получается разрулить логику.
ИМХО эти переходы надо запретить.

Например ты выбрал все 19, перешел снова на 1-й и что дальше? Выбирать не из чего, т.к. остальные 18 уже выбраны.

По коробкам он движется строго последовательно,
т.е. карусель ему нужна не для коробок, а для невыбранных шаров очередной коробки.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700304
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стоит отметить разнобразие констант
18, 20, 19
красивше, когда одна
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700311
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98Стоит отметить разнобразие констант
18, 20, 19
красивше, когда однаУ автора разные исходные условия, отсуда и чехарда с конечными цифрами.jenya7
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
int box_number;
byte ball_number;

private void Form1_Load(object sender, EventArgs e)
{     
  ball_number = 1;
  box_number = 0;
}

private void buttonEnter_Click(object sender, EventArgs e)
{  
   if (ball_number < 20)
   {
       mslseq[box_number] = ball_number;
       selected[ball_number] = 1;
   }

   //select next box
   box_number++;

   //find first available ball
    ball_number = GetNextBallNumber(UP_KEY, 1);
    g_counter = ball_number;

    if (box_number > 18)
    {
        box_number = 0;
        textBoxDisplay.Text = "Finished!!!";
    }

}
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700313
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что всё же тут 19 каналов ошибок, если поднять недавнюю тему ТС.
А вот для перемещения по циклу одного канала можно использовать как указатель (с перескакиванием через занятые), так и перемещение по списку свободных. Если надо отображать только свободные.

Для каждого канала свой указатель либо свой список. Ну или сверяться с единым массивом занятых как у ТС. По-моему он запутался на ровном месте.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39700650
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Возникла такая вот алгоритмическая проблема.

Есть 19 коробок. В каждой коробке 19 пронумерованных шаров от 1 до 19.
Скажем начинаем с первой коробки - выбираем там шар номер 2. Во второй коробке я могу выбрать любой шар кроме номер 2.
Скажем выбрал шар номер 3. В третьей коробке я могу выбрать шар только из оставшихся 1,4,5,6,7,8,9,10...и так далее
Проблема как отображать оставшиеся шары на дисплее циклически?

Есть три кнопки ENTER,UP,DOWN.
ENTER выбирает следующую коробку - движение только вверх, вернуться к предыдущей коробке я не могу.
UP, DOWN выбирают следующий доступный шар.
И текущая коробка и выбранный шар отображаются на дисплее.
похоже на обычную очередь/стэк
шарики запомнить и в других коробках игнорировать
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39701225
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подкоректировал и сейчас работает как надо
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
byte GetNextBallNumber(int key, byte b_num)
        {
            int done = 0;
            int b_num_sel = b_num;

            while (done == 0)
            {
                if (selected[b_num] == 0)
                {
                    done = 1;
                    return b_num;
                }
                else
                {
                    if (key == UP_KEY)
                    {
                        b_num++;
                        if (b_num > 19)
                        {
                            b_num = 1;
                        }
                        if (b_num == b_num_sel)
                        {
                            done = 1;
                            return b_num;
                        }
                    }
                    else if (key == DOWN_KEY)
                    {
                        b_num--;
                        if (b_num < 1) 
                        {
                            b_num = 19;
                        }
                        if (b_num == b_num_sel)
                        {
                            done = 1;
                            return b_num;
                        }
                    }
                }
            }

            return 0;
        }
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39701229
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем переменная done если после ее изменения всегда return?
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39701232
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЗачем переменная done если после ее изменения всегда return?
в принципе не нужна.
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39701243
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
технически там бесконечный цикл
и непонятно откуда взявшийся selected
...
Рейтинг: 0 / 0
Перебор не занятых шаров
    #39701356
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудухтехнически там бесконечный цикл
и непонятно откуда взявшийся selected
selected - чтоб пометить выбранные шары.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перебор не занятых шаров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]