Ejercicios de la copa del puente azul <Pregunta sobre el asiento> Enumeración de permutación next_permutation

Tema Descripción

En la escuela de Little A, la maestra finalmente resolvió el problema de registro de la Copa Blue Bridge, y ahora la maestra está preocupada nuevamente.

Ahora hay N estudiantes participando en la competencia, pero el maestro quiere arreglar asientos para ellos, pero hay demasiados arreglos.

El maestro realmente quiere saber cómo es el resultado de la fila final y cuántos resultados hay.

Por favor diseñe un programa para ayudar al maestro.

Finalmente, basta con dar salida a los nombres de las personas en varias situaciones, una situación por línea, y los nombres de cada situación se ordenan según el orden de registro y entrada.

ingrese la descripción

La primera línea de entrada contiene un número entero N.

Cada una de las siguientes N líneas contiene una cadena S​, que representa el nombre de la persona.

1≤N≤10,∑N​∣Si​∣≤10^2。

descripción de salida

Da salida a un total de varias líneas, y cada línea da salida a los nombres de personas en varias situaciones. Un caso por línea, y los nombres de cada caso se ordenan según el orden de registro o entrada.

Muestras de entrada y salida

ejemplo

ingresar

3
xiaowang
xiaoA
xiaoli

producción

xiaowang xiaoA xiaoli
xiaowang xiaoli xiaoA
xiaoA xiaowang xiaoli
xiaoA xiaoli xiaowang
xiaoli xiaowang xiaoA
xiaoli xiaoA xiaowang

Esta pregunta usa la enumeración de permutación completa. Hay un algoritmo muy conveniente en el contenedor de C++ que puede realizar la permutación completa, llamado next_permutation(). El parámetro que se pasa es un rango, que se pasa mediante un iterador. Si se encuentra la siguiente permutación de la secuencia, devuelve verdadero; si ya es la última permutación, devuelve falso. Tenga en cuenta que si desea dar una permutación completa con esto, primero debe organizar la secuencia en orden ascendente; si está en orden descendente, usa pre_permutation() 

Tenga en cuenta que esta pregunta es para organizar completamente las cadenas, y el orden requerido está de acuerdo con el orden de entrada, por lo que no podemos usar directamente este algoritmo para organizar completamente los contenedores de cadenas. Solo podemos usar un contenedor más para almacenar The subíndice del contenedor de cadenas, el código escrito es el siguiente (por supuesto, el método recursivo también se puede usar para escribir el arreglo completo, pero es conveniente llamar directamente al algoritmo de C ++, y la función también es poderosa)

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
  vector<string> M1;
  vector<int> M2;
  int N;
  string name;
  cin >> N;
  for(int i = 0;i<N;i++)
  {
    cin >> name;
    M1.push_back(name);
    M2.push_back(i+1);
  }

 
do{
  for(vector<int>::iterator it = M2.begin() ; it!= M2.end() ; it++)
  {
      cout << M1[(*it-1)] <<" " ;    //注意下标要对齐
  }
  cout << endl;
}while(next_permutation(M2.begin(),M2.end()));
  // 请在此输入您的代码
  return 0;
}

Supongo que te gusta

Origin blog.csdn.net/mc10141222/article/details/123805815
Recomendado
Clasificación