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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
#1

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

15.11.2012, 01:46. Просмотров 533. Ответов 9
Метки нет (Все метки)

Имеется задача: есть четыре шара пронумерованных 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};
И бегать по ним туда-сюда чтобы считать значение очередного элемента в качестве результата ЗАПРЕЩАЕТСЯ.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2012, 01:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод сочетания шаров (C++):

Вывод сообщения о нажатии сочетания клавиш - C++
Что неправильно? LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM IParam) case WM_KEYDOWN: { int nVirtKey =...

Сочетания с повторениями - C++
Очень нужен алгоритм сочетаний с повторениями.

Буквенные сочетания. - C++
Всем привет. Озадачился. Есть 2 регистра англ. алфавита, хочу вывести все 2х буквенные сочетания верхнего и нижнего регистра и...

Комбинаторика. Сочетания - C++
Добрый день! Прошу помочь со следующей задачкой: генерация сочетания по номеру(порядок лексикографический). Толковое объяснение нашел...

Сочетания элементов массива - C++
Всем привет!Нужна помощь. У меня задание: есть целочисленный массив, нужно определить и выписать те элементы массива, сумма которых не...

Столкновение шаров - C++
Помогите пожалуйста написать условие столкновения шаров void impact(Sphera &amp; a,Sphera &amp; b) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
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++)
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 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;
}
Немного поправил
0
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;
}
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.11.2012, 02:46  [ТС] #5
Croessmah, верно
Ptomaine, неверно

Добавлено через 2 минуты
Croessmah, а для более больших значений не составит труда сделать? Ну например 7 шаров и сочетания из 4-х шаров.
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
15.11.2012, 02:57 #6
Цитата Сообщение от kravam Посмотреть сообщение
Croessmah, а для более больших значений не составит труда сделать? Ну например 7 шаров и сочетания из 4-х шаров.
Можно, но, думаю, лучше не так делать. Либо рекурсия, либо пользоваться N^позиция_шара
0
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;
}
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 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(кол-во_знаков,кол_шаров);
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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;
}
0
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,400
Записей в блоге: 3
Завершенные тесты: 1
15.11.2012, 11:35 #10
Цитата Сообщение от kravam Посмотреть сообщение
Общее количество шаров регулируется в макросе.
а у меня передается в функцию void foo(int N, int S)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 11:35
Привет! Вот еще темы с ответами:

вычислить все сочетания из N элементов по M - C++
на С нужно реализовать алгоритм вычисления всех возможных сочетаний из N элементов по M. подскажите пожалуста, как это сделать

Графика С++, столкновение шаров - C++
дана задача: на экране движутся два шара разного размера и разной скоростью. Начальны размер выбирается пользователем (из 3-х вариантов),...

Центральное столкновение шаров - C++
Здравствуйте! Написал программу для центрального столкновения двух шаров...но программа выполняется некорректно....подскажите, что не так...

Написать рекурсивную функцию вычисления сочетания n то k - C++
Вот проблемка Написать рекурсивную функцию вычисления сочетания n то k.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.11.2012, 11:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru