Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 02.06.2011, 10:29   #1
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
Вопрос Все возможные комбинации

Доброго времени суток

У меня возник вопрос:
Есть на вывод текст
Код:

int[] array = {1,2,3};
for(int i=0; i<3; i++)
System.out.print(array[i]+" ");

возможно ли сделать чтобы программа выводила возможные
варианты перестановки этих трех значений
X@OC вне форума   Ответить с цитированием
Старый 02.06.2011, 10:43   #2
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
По умолчанию

был значит вариант с тремя циклами
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
for(int k=0; k<3; k++)

но этот вариант мне не подходит слишком просто и не интересно
X@OC вне форума   Ответить с цитированием
Старый 02.06.2011, 11:45   #3
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
Хорошо

вот нашел только на Си
на JAVA можно переделать
Код:

#include <conio.h>
#include <stdio.h>

int N=3;

void swap(int *a, int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}

void reverse(int *P, int m)
{
int i=0, j=m;
while(i<j)
	{
	swap(&P[i], &P[i]);
	++i;
	--j;
	}
}

void antilex(int *P, int m)
{
int i;
if(m==0)
 {
 for(i=0; i<N; i++)
	printf("%d ",P[i]);
   printf("\n");
 }
 else
 {
   for(i=0; i<=m; ++i)
   {
   antilex(P,m-1);
   if(i<m)
	{
	swap(&P[i], &P[m]);
	reverse(P, m-1);
	}
   }
 }
}

void main()
{
int i;
int P[3];
clrscr();
for(i=0; i<N; i++)
P[i] = i+1;
antilex(P,N-1);
getch();
}

X@OC вне форума   Ответить с цитированием
Старый 02.06.2011, 17:16   #4
netrino
Профессионал
 
Аватар для netrino
 
Регистрация: 15.07.2008
Адрес: г. Киев, Украина
Сообщений: 1,933
Репутация: 736
По умолчанию

Вот самое простое, что пришло в голову:
Код:

import java.util.Arrays;

class Program {
    
  static void showPermutations(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
      for (int j = 0; j < arr.length - 1; j++) {
        System.out.println(Arrays.toString(arr));
        int tmp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = tmp;
      }
    }
  }
 
  public static void main(String[] args) {
    int[] first = { 1, 2, 3 };
    int[] secnd = { 1, 2, 3, 4 };
 
    System.out.println("-- First -- ");
    showPermutations(first);
 
    System.out.println("-- Second -- ");
    showPermutations(secnd);
  }
}


Последний раз редактировалось netrino; 02.06.2011 в 17:19.
netrino вне форума   Ответить с цитированием
Старый 02.06.2011, 17:42   #5
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
По умолчанию

netrino можно вопрос?
вот все эти перестановки и все такое
3 кнопки Num, Caps, Scroll Lock у них есть состояние вкл и выкл
как сделать такой беребор

вкл__ вкл__ вкл
вкл__ выкл_ выкл
выкл_ вкл__ выкл
выкл_ выкл_ вкл
вкл__ вкл__ выкл
вкл__ выкл_ вкл
выкл_ вкл__ вкл
выкл_ выкл_ выкл
X@OC вне форума   Ответить с цитированием
Старый 04.06.2011, 16:25   #6
netrino
Профессионал
 
Аватар для netrino
 
Регистрация: 15.07.2008
Адрес: г. Киев, Украина
Сообщений: 1,933
Репутация: 736
По умолчанию

А такой порядок обязателен?
netrino вне форума   Ответить с цитированием
Старый 04.06.2011, 23:55   #7
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
По умолчанию

все равно какой порядок
X@OC вне форума   Ответить с цитированием
Старый 05.06.2011, 00:45   #8
netrino
Профессионал
 
Аватар для netrino
 
Регистрация: 15.07.2008
Адрес: г. Киев, Украина
Сообщений: 1,933
Репутация: 736
По умолчанию

Тогда самое простое, что пришло в голову - бинарные числа. Запись чисел в двоичной системе состоит из 0 и 1, что можно понимать как Выкл. Вкл., с другой стороны, цифры от 0 до 7 записываются неповторяющимися множествами в трёх разрядах. То есть перебрав числа от 0 до 7 и поглядев на значения их трёх младших битов, можно получить все возможные множества, которые можно составить из цифр 0 и 1 в трёх разрядах. Пример:
Код:

class Program {
 
  public static void main(String[] args) {
 
    String[] on_or_off = { "Выкл", "Вкл " };
 
    // В трёх разрядах в 2сс умещаются числа от 0 до 7
    // Прибавляя каждый раз к цифре по 1 мы получим
    // все возможные множества, которые можно составить из трёх разрядов и двух цифр
    for (int i = 0; i <= 7; i++) {
      for (int j = 2; j >= 0; j--) {
        int index = (i >> j) & 1; // проверяем соответствующий разряд
        System.out.print(on_or_off[index] + " "); // если 0, то выведет Выкл, если 1 - то Вкл.
      }
      System.out.println();
    }
  }
}

Если эти значения нужны далее, можно записывать их в массив, если нужно для произвольного количества состояний (а не только для Вкл, Выкл), то тоже можно записать соответствующим образом по этому образцу.
netrino вне форума   Ответить с цитированием
Старый 05.06.2011, 11:09   #9
X@OC
Форумчанин
 
Аватар для X@OC
 
Регистрация: 18.06.2010
Адрес: Украина
Сообщений: 273
Репутация: 30
По умолчанию

интересно так с этими разрядами
спасибо
X@OC вне форума   Ответить с цитированием
Старый 04.07.2011, 20:34   #10
Я_и
Пользователь
 
Регистрация: 14.09.2010
Сообщений: 37
Репутация: 15
По умолчанию

Перестановок n!, значит каждому числу от 0 до (n!-1) можно поставить в соответствие одну перестановку. Алгоритм такой:

Код:

var Fact=фaкториал(n)
for(int i=0;i<Fact;i++)
{
     var A=остаток от деления i на n;
     var A1=целая часть от деления i на n;
     выводим число с индексом А
     var B=остаток от деления А на n;
     var B1=целая часть от деления B на n;
     выводим В-е число среди тех, которые еще не выводились...
     и т.д.
}

Всё, что в цикле, нужно обобщить во вложенный цикл(в котором будут 3 строчки)....

Если кто не понял - извините, плохо умею высказывать свои мысли(
Я_и вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны цифры от 1 до 38 нужно составить все возможные комбинации из 6 чисел без повторений. gector Фриланс 14 01.04.2013 20:20
Возможные комбинации из чисел Serg1k Microsoft Office Excel 9 29.06.2011 17:24
Все возможные комбинации массива и непонятная процедура. Ksardas13 Общие вопросы Delphi 2 22.05.2011 02:04
Возможные комбинации firephenix Помощь студентам 1 01.04.2011 02:19
Все возможные слагаемые anGeee Паскаль 4 04.12.2008 21:22


09:38.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru