Занятие 3. Справочник

Занятие 3. Справочник

Генерация всех сочетаний из N по M
import java.io.*;
import java.util.*;

public class Gen
{
	static PrintWriter out = new PrintWriter(System.out);
	
	static int[] K;
	static int  N, M; 
	
	static void print(int n)
	{
		for (int i = 0; i < n; i++)
		{
			out.print(K[i] + " ");
		}	
		out.println();
	}
	
	static void gen(int k)
	{
	  if (k == M) print(M);
	  else
	  {	  
		  int start = 1;
		  if (k > 0) start = K[k-1] + 1;
		  for (int i = start; i <= N; i++)
		  {    
			  K[k] = i;
			  gen(k + 1);
		  }
	   }	  
	 }
		
	public static void main(String[] args) throws IOException
	{
		Scanner in = new Scanner(System.in);
	        N = in.nextInt();
	        M = in.nextInt();
		K = new int[M];

		gen(0);
		out.flush();
         }
}
Генерация всех перестановок
static void gen(int k)
{
  if (k == M) print(M);
  else
  {
	for (int i = 1; i <= N; i++)
	{    
		  if (found(i, k)) continue; 
		  K[k] = i;
		  gen(k + 1);
	}
  }
}
Она использует функцию found, Которая ищет значение v среди первых n элементов массива K
static boolean found(int v, int n)
{
	for (int i = 0; i < n; i++)
	{
		if (K[i] == v) return true;
	}	
	return false;
}
Генерация следующей перестановки
static void swap(int p[], int i, int j){
     int tmp = p[i];
     p[i] = p[j];
     p[j] = tmp;
}
static void reverse(int p[], int l){
    int r = p.length - 1;
    for(; l < r; l++, r--){
        swap(l, r);
    }
}

static boolean generateNextPermutation(int[] p) {
    int k = p.length - 2;
    while(k >= 0 && p[k] >= p[k + 1]){
        k--;
    }
    if(k == -1){
        return false;
    }
    int t = p.length - 1;
    while(p[t] <= p[k]){
        t--;
    }
    swap(t, k);
    reverse(k + 1);
    return true;
}
Генерация следующей анаграммы
private String getNext(String s) 
{
// Удобно проводить операции с массивом символов,
// а не с объектами класса String.
char a[] = s.toCharArray();

	int n = a.length;
	int k = a.length-2;
	if (k < 0)
		return new String(a);
	while(a[k] >= a[k+1]){
		k--;
		if (k == -1){
			Arrays.sort(a);
			return new String(a);
		}
	}
	int t = -1;
	for(int i=k+1;i a[k] && (t == -1 || a[t] > a[i])){
			t = i;
		}
	}
	
	char tmp = a[k];
	a[k] = a[t];
	a[t] = tmp;

	Arrays.sort(a, k + 1, n);

	return new String(a);
}
Перестановка по номеру
k--;
boolean used[] = new boolean[n];
for (int i = 0; i < n; i++) used[i] = false;
for (int i = 0; i < n; i++)
{
    int j = 0;
    while (used[j]) j++;
    while (k >= fact(n - i - 1)){
        j++;
        k -= fact(n - i - 1);
        while (used[j]) j++;
    }
    used[j] = true;
    out.print((j + 1) + " ");
}
Номер размещения
long res = 1;
int to = k;
for (int i = 1; i <= to; i++)
{
	int x;
	x = in.nextInt();
	for (int j = 1; j < x; j++) {
		if (used[j])
			continue;
		res += fact(n – i) / fact(n - i - k + 1);
	}
	used[x] = 1;
	k--;
}