Форум программистов, компьютерный форум CyberForum.ru

Вывод сочетания шаров - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.11.2012, 01:46     Вывод сочетания шаров #1
Имеется задача: есть четыре шара пронумерованных 0, 1, 2, 3; вывести все сочетания шаров из 4 по 3 с возвратом и с учётом порядка.
Если использовать такое решение (псевдокод):

C++
1
2
3
4
5
6
for (int i= 0; i++; i< 4 )
for (int j= 0; j++; j< 4 )
for (int k= 0; k++; k< 4 ) {
 printf ("%d %d %d\n", i, j, k);
 printf ("______________________\n");
}
То вывод будет:

0 0 0
0 0 1
0 0 2
0 0 3
____________________
0 1 0
0 1 1
0 1 2
0 1 3
____________________
0 2 0
0 2 1
0 2 2
0 2 3
____________________
0 3 0
0 3 1
0 3 2
0 3 3
____________________
1 0 0
1 0 1
1 0 2
1 0 3
____________________

и так далее.

Теперь внимание, вопрос:
Как сделать такой вывод:
0 0 0
0 0 1
0 0 2
0 0 3
____________________
0 1 3
0 1 2
0 1 1
0 1 0
____________________
0 2 0
0 2 1
0 2 2
0 2 3
____________________
0 3 3
0 3 2
0 3 1
0 3 0
____________________
1 3 0
1 3 1
1 3 2
1 3 3
____________________


То есть каждый раз, пробежавшись в цикле по числу от 0 до N. следующий раз в этом же цикле по этому же числу необходимо пробегать в обратном порядке.

Использовать массивы, например
C++
1
int array [10]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
И бегать по ним туда-сюда чтобы считать значение очередного элемента в качестве результата ЗАПРЕЩАЕТСЯ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 01:46     Вывод сочетания шаров
Посмотрите здесь:

Графика С++, столкновение шаров C++
вычислить все сочетания из N элементов по M C++
Буквенные сочетания. C++
C++ Сочетания с повторениями
C++ Центральное столкновение шаров
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
15.11.2012, 01:56     Вывод сочетания шаров #2
чей то я твоей задачи не понял

Цитата Сообщение от kravam Посмотреть сообщение
То есть каждый раз, пробежавшись в цикле по числу от 0 до N. следующий раз в этом же цикле по этому же числу необходимо пробегать в обратном порядке.
ты вот это имел ввиду?
C++
1
2
3
4
5
6
int i;
for(i=0;i<N;i++)
.....................
for(;i>=0;i--)
.....................
for(;i<N;i++)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11827 / 6806 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 02:05     Вывод сочетания шаров #3
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
2
3
4
5
6
for (int i= 0; i++; i< 4 ) 
for (int j= 0; j++; j< 4 ) 
for (int k= 0; k++; k< 4 ) { 
printf ("%d %d %d\n", i, j, k); 
printf ("______________________\n"); 
}
уверены, что будет работать?
0 3 3
0 3 2
0 3 1
0 3 0
____________________
1 3 0
1 3 1
1 3 2
1 3 3
а какая здесь зависимость?

Добавлено через 3 минуты
Как вариант:
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
#include <stdio.h>
#include <cstdlib>
int main () {
 
for (int i= 0; i< 4;i++)
    if(i%2)
        for (int j= 3; j>=1; j--)
            if (!(j%2))
                for (int k= 3; k>=0;k--) {
                    printf ("%d %d %d\n", i, j, k);
                    printf ("______________________\n");
                }
            else
                for (int k= 0; k<4;k++) {
                    printf ("%d %d %d\n", i, j, k);
                    printf ("______________________\n");
                }
    else
        for (int j= 0; j< 4; j++)
            if (j%2)
                for (int k= 3; k>=0;k--) {
                    printf ("%d %d %d\n", i, j, k);
                    printf ("______________________\n");
                }
            else
                for (int k= 0; k<4;k++) {
                    printf ("%d %d %d\n", i, j, k);
                    printf ("______________________\n");
                }
    system("pause");
    return 0;
}
Немного поправил
Ptomaine
 Аватар для Ptomaine
13 / 13 / 0
Регистрация: 22.10.2011
Сообщений: 35
15.11.2012, 02:21     Вывод сочетания шаров #4
Ещё вариант:

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
#include <iostream>
#include <cmath>
 
int main()
{
    const int N = 4;
    int S = 0;
 
    for (int a = 0; a < N; ++a)
    {
        for (int b = 0; b < N; ++b)
        {
            for (int c = 0; c < N; ++c)
            {
                std::cout << a << b << int(std::abs(S - c)) << std::endl;
            }
 
            std::cout << std::endl;
 
            S = (!S ? N - 1 : 0);
        }
    }
 
 
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.11.2012, 02:46  [ТС]     Вывод сочетания шаров #5
Croessmah, верно
Ptomaine, неверно

Добавлено через 2 минуты
Croessmah, а для более больших значений не составит труда сделать? Ну например 7 шаров и сочетания из 4-х шаров.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11827 / 6806 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 02:57     Вывод сочетания шаров #6
Цитата Сообщение от kravam Посмотреть сообщение
Croessmah, а для более больших значений не составит труда сделать? Ну например 7 шаров и сочетания из 4-х шаров.
Можно, но, думаю, лучше не так делать. Либо рекурсия, либо пользоваться N^позиция_шара
Ptomaine
 Аватар для Ptomaine
13 / 13 / 0
Регистрация: 22.10.2011
Сообщений: 35
15.11.2012, 03:06     Вывод сочетания шаров #7
Тогда может так?:

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
#include <iostream>
#include <cmath>
 
int main()
{
    const int N = 4;
    int S1 = 0, S2 = 0;
 
    for (int a = 0; a < N; ++a)
    {
        for (int b = 0; b < N; ++b)
        {
            for (int c = 0; c < N; ++c)
            {
                std::cout << a << int(std::abs(S1 - b)) << int(std::abs(S2 - c)) << std::endl;
            }
 
            std::cout << std::endl;
 
            S2 = (!S2 ? N - 1 : 0);
        }
 
        S1 = (!S1 ? N - 1 : 0);
    }
 
 
    return 0;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11827 / 6806 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 05:08     Вывод сочетания шаров #8
Цитата Сообщение от kravam Посмотреть сообщение
а для более больших значений не составит труда сделать? Ну например 7 шаров и сочетания из 4-х шаров.
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
#include <math.h>
#include <cstdlib>
#include <iostream>
using namespace std;
void foo(int N, int S){
    int maxnum=pow(N,S);
    int *powh=new int[S+1];
    for(int i=S;i>=0;--i)
        powh[i]=pow(N,i);
    for(int num=0;num<maxnum;++num){
        for(int i=S;i>0;i--){
            std::cout<<(((num/powh[i])%2)?(N-1-((num/powh[i-1])%N)):((num/powh[i-1])%N));
        }
        std::cout<<std::endl;
    }
    delete [] powh;
}
 
int main()
{
    foo(5,4);
   system("pause");
   return 0;
}
C++
1
foo(кол-во_знаков,кол_шаров);
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.11.2012, 11:34  [ТС]     Вывод сочетания шаров #9
мой вариант, я сделал основной упор на то, чтобы можно было изменить количество вытаскиваемых шаров. Если оно увеличивается на 1, (то есть вместо 3-х вытаскиваемых шаров захотелось сделать 4), необходимо добавить строки в места, которые я отметил. И всё. Общее количество шаров регулируется в макросе.
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
#include <windows.h>
#include <stdio.h>
#define col 5
 
//+++++++++++++++++++++++++++++++++++++++++++++++
bool f (int& arg) {
  if ((arg== col- 1)||(arg== - 1)) {
    if (arg== col- 1) 
      arg=-(arg+2);
    arg++;
    return true; 
  }  
  return false; 
}
//+++++++++++++++++++++++++++++++++++++++++++++++
 
 
int main()
 
{
 
  //сюда
  //int l= 0;
    int i= 0;
    int j= 0;
    int k= 0;
 
 
  //  сюда
  //for (;;l++) {
    for (;;i++) {
    for (;;j++) {
    for (;;k++) {
 
                //сюда  
                //printf ("%d ", abs (l<0?l+1:l));
                  printf ("%d ", abs (i<0?i+1:i));
                  printf ("%d ", abs (j<0?j+1:j));
                  printf ("%d ", abs (k<0?k+1:k));
                  printf ("\n");
                  if (f (k))
                   break; 
    }  
                  printf ("-----------------------------\n"); 
                  if (f (j))
                   break; 
    }        
                  printf ("-----------------------------\n"); 
                  if (f (i))
                   break; 
    }
                //сюда  
                //printf ("-----------------------------\n"); 
                //if (f (l))
                //break; 
                //}
 
    printf ("\n");
    getchar ();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 11:35     Вывод сочетания шаров
Еще ссылки по теме:

C++ Столкновение шаров
C++ Комбинаторика. Сочетания
C++ Сочетания элементов массива

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11827 / 6806 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
15.11.2012, 11:35     Вывод сочетания шаров #10
Цитата Сообщение от kravam Посмотреть сообщение
Общее количество шаров регулируется в макросе.
а у меня передается в функцию void foo(int N, int S)
Yandex
Объявления
15.11.2012, 11:35     Вывод сочетания шаров
Ответ Создать тему
Опции темы

Текущее время: 19:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru