Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перебор не занятых шаров / 25 сообщений из 32, страница 1 из 2
09.09.2018, 12:20
    #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
09.09.2018, 17:37
    #39700118
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Задача не сформулирована.
Покажи, как должно работать, на примере с 4 коробками и шарами.
...
Рейтинг: 0 / 0
09.09.2018, 18:13
    #39700123
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
jenya7,

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

После того как человек выбирает i-тый шар,
номер выбранного шара помещаешь на i-тое место, а остальные номера сдвигаешь.
Т.о. у тебя всегда в начале массива будут выбранные номера, в конце - не выбранные.
Ну и останется только закольцевать в UI невыбранные, ты должен справиться.
...
Рейтинг: 0 / 0
09.09.2018, 21:29
    #39700165
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Тут что-то не то. После декремента не принято сравнивать переменную на "больше".
Код: c#
1.
2.
3.
    g_counter--;
    if (g_counter > 19)
           g_counter = 19;
...
Рейтинг: 0 / 0
09.09.2018, 22:42
    #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
10.09.2018, 05:17
    #39700205
Gennadiy Usov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
А если взглянуть на эту задачу с точки зрения задачи расстановки ферзей.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

По коробкам он движется строго последовательно,
т.е. карусель ему нужна не для коробок, а для невыбранных шаров очередной коробки.
...
Рейтинг: 0 / 0
10.09.2018, 11:19
    #39700304
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Стоит отметить разнобразие констант
18, 20, 19
красивше, когда одна
...
Рейтинг: 0 / 0
10.09.2018, 11:30
    #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
10.09.2018, 11:31
    #39700313
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Похоже, что всё же тут 19 каналов ошибок, если поднять недавнюю тему ТС.
А вот для перемещения по циклу одного канала можно использовать как указатель (с перескакиванием через занятые), так и перемещение по списку свободных. Если надо отображать только свободные.

Для каждого канала свой указатель либо свой список. Ну или сверяться с единым массивом занятых как у ТС. По-моему он запутался на ровном месте.
...
Рейтинг: 0 / 0
10.09.2018, 20:30
    #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
12.09.2018, 08:18
    #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
12.09.2018, 08:25
    #39701229
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Зачем переменная done если после ее изменения всегда return?
...
Рейтинг: 0 / 0
12.09.2018, 08:29
    #39701232
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
Dima TЗачем переменная done если после ее изменения всегда return?
в принципе не нужна.
...
Рейтинг: 0 / 0
12.09.2018, 08:49
    #39701243
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
технически там бесконечный цикл
и непонятно откуда взявшийся selected
...
Рейтинг: 0 / 0
12.09.2018, 11:46
    #39701356
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перебор не занятых шаров
полудухтехнически там бесконечный цикл
и непонятно откуда взявшийся selected
selected - чтоб пометить выбранные шары.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перебор не занятых шаров / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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