algoritmos blancos de la escuela: DFS permutaciones y combinaciones de los problemas

Preparación:

Ilustrar algunos de los términos y cuestiones, y para facilitar la comprensión.
1. índice de matriz comenzó a partir de 01, no 0 índice.
2.dfs recursiva llamados cero profundidad 1, la profundidad 2 de forma recursiva llama una vez, y así sucesivamente.
3. La profundidad de cada DFS algunas operaciones a realizar, un espacio profundo operación de cálculo colectivamente.
4. En la disposición de la figura explicar la resolución de combinación traverse

arreglo

Problema: Dado un número de tablas que contienen elementos N, el número k seleccionado de, muchas permutaciones pueden constituir
la salida y cada permutación del número total de permutaciones, tres amplio campo de cada operando.
En el código:

#include <iostream>
#include <cstdio>
using namespace std;
int number[100];  //存储数表 
int book[100];  //哨兵 ,初始为0,代表未使用过 
int num[100];  //存储找到的排列 
int n,k,count;  //n为数表的长度,k为每个排列数包含的元素个数,count为总的排列数

void dfs(int step){
 if( step == k+1){    //step从 1 开始计算,当step == k+1 时,表示找到了一种排列 
  for(int i = 1;i<=k;i++)
   printf("%3d",num[i]); //输出排列数 
  printf("\n");
  count++;  //排列数个数 +1 
  return ;
 }
 for(int i = 1;i<=n;i++){
  if(book[i]==0){
   book[i]=1;   //标记点A, 1 表示该元素已用 
   num[step]=number[i];//将当前元素放在存储排列数的数组中 
   dfs(step+1);        //进入下一个深度空间 
   book[i]=0;   //标记点B,回溯时,将当前点标记为未用 
  }
 }
 
 return;
}

int main()
{
 scanf("%d %d",&n,&k);
 
 for(int i=1;i<=n;i++)  //注意,数组从 1 号索引开始使用 
  scanf("%d",&number[i]);
 printf("\n");
 dfs(1);         //进入dfs,当前:深度为1,递归0次 
 printf("%3d",count);
 return 0;
}

combinación

Composicional Problema:
Dado un número de tablas que contienen n elementos, que seleccionó número k, el número de combinaciones puede constituir
la salida de cada combinación y el número total de combinaciones, cada una de la amplia número de campo de tres
en el código:

#include <iostream>
#include <cstdio>
using namespace std;
int number[100]; //存放数表 
int num[100];  //存放查找到的组合数 
int count,n,k;   //count记录总的组合数个数,n为数表长度,k为每个组合数包含元素的个数

void dfs(int step,int startx) //step为深度,startx表示当前深度循环开始的索引 
{
 if(step == k+1){  //step从 1 开始计算,当step == k+1 时,表示找到了一种组合
  for(int i=1;i<=k;i++){
   cout << "   " << num[i];//输出找到的组合数 
  }
  cout << endl;
  count++;  //组合数个数 +1 
  return ;
 }
 for(int i=startx;i<=n;i++){
  num[step]=number[i];//将当前元素放在存储组合数的数组中 
  dfs(step+1,i+1); // i+1 表示下一深度的循环只能遍历当前索引之后的数(此处记为标记点C) 
 }
}

int main()
{
 cin >> n >> k;
 for(int i=1;i<=n;i++) //注意,数组从 1 号索引开始使用 
  cin >> number[i];
 dfs(1,1);  //进入dfs,当前:深度为1,递归0次,循环从第一个元素开始遍历 
 cout << "   " << count;
}

análisis

Enfoque del análisis es que estos dos códigos de diferentes razones. Al explorar las razones, la comprensión en profundidad del papel de la circulación y Sentinel.
Es fácil ver, donde la diferencia entre estos dos códigos:
un punto de partida diferente 1. ciclo.
2. El uso de un centinela, un no se utiliza.
Vamos a explorar dibujando diferentes razones.
Cuestionar la introducción: Vamos a organizar una combinación de problemas, al pensar en el mapa. a continuación;
Aquí Insertar imagen Descripción

Un problema, el sistema de análisis

Pregunta: En la figura de tres elementos, seleccione los dos elementos constituyen un arreglo, un total de cuántos programa de opciones?
Solución:
El primer paso: desde cuando1 Empezar a caminar, podemos conseguir 12 y13Dos arreglos.
Paso Dos: Cuando desde2Comenzó a tomar el tiempo, de acuerdo con los principios de la disposición, que puede tener21y3Esquema dos arreglos.
Así que la pregunta es (registrado como cuestiones X):
Cuando empecé a ir desde el 2, ¿Cómo me aseguro el espacio operacional a una profundidad de 2, puedo recorrer todos los elementos distintos de los elementos han sido atravesados ​​(es decir 2 aquí) de?

debut en el ciclismo

Fijo el bucle para iterar1 ~ nElementos, entonces yoPuede atravesar el espacio a cada profundidad en funcionamiento todos los elementos. Éstos son todos los elementos , incluyendo la de elemento de curso ya atravesado (esto es2). Entonces, ¿cómo excluidos los elementos atravesado?

Gran debut Sentinel

Cuando se recorre cada elemento, poner el elemento está marcado como ya se utiliza , entonces el siguiente espacio profundo, el informe del Sentinel, podemos evitar reiterar los elementos han sido atravesado. Este es el papel marcado el punto A. Por lo tanto, el problema no se resuelve X todavía?
Por lo tanto, hay un problema: Mark punto B está haciendo qué? ¿Por qué quiere volver atrás en el tiempo y marcado como el elemento actualno usadoSe?
Seguir explorando, damos una de castaño:
Aquí Insertar imagen Descripción
Si no hay un marcador B :
Cuando1Como punto de partida para encontrar12y13Después, de vuelta a una profundidad de 1 espacio operacional, y luego la gran pregunta es, Sentinel informó: "No tenemos ningún elemento disponible de !."
Esto obviamente no es ah, esta vez para marcar el papel del punto B se manifiesta.
Tenemos que mirar los marcadores B situación:
hallazgo12y13Después, volvimos a la profundidad1espacio de cálculo, ya que esta vez el punto de marca B existe,1 y 2 y el elemento se marca como no utilizadaSentinel informe que dice: "2No hay elementos disponibles! "Entonces seremos capaces de2Como punto de partida, seguir encontrando nuevo esquema de arreglo.

Sentinel, bajo problema de la permutación cíclica en el siguiente resumen

ciclo completo: Se refiere a atravesar todos los elementos para asegurarse de que puede atravesar todos los elementos de la profundidad espacial del espacio de cada operador.
centinela: Marcador de puntos A, dispuesto para asegurar que cuando se ha utilizado una sola búsqueda, no alineada con el elemento actual;
marcador de punto B, la garantizada cuando se busca otro esquema de permutación puede ser utilizado cuando se usa la disposición de elementos se ha encontrado.

Aquí eso es un poco complicado, damos otro castaño de explicar:

Marcar punto A: Cuando a partir1Inicio, operación recursiva en la profundidad del espacio 2, puedo usar ya no1Número de elementos.12(O13) ¿Es el sistema actual ,1Ningún elemento de la disposición actual ya es elementos utilizados.
** marcador B: ** cuando encuentro12y13Vez (esta vez12y13Es la disposición que se ha encontrado, 2 del esquema ya está buscando un elemento utilizado), todavía puede2Como punto de partida para encontrar un nuevo programa de arreglos de nuevo.

Segundo problema: la combinación de análisis

Antes de decir. Combinaciones y permutaciones de los bloques de código en cuanto al uso de circulantes y centinela diferencias,
arreglo de comparación, se han encontrado que la combinación no utiliza Sentry , y no el ciclo completo . Obviamente, una combinación de código de asa utilizado, su punto de partida es la profundidad DFS actual (que llamaremos este ciclo para cambiar el ciclo de arranque ).

Con nuestra combinación no se utiliza para explorar por qué el centinela, y el uso de un punto de partida de ciclo variable

Fuimos a la hora de seguir las castañas (todavía por encima de la cifra en uso):
Aquí Insertar imagen Descripción
Si estamos usando el bucle completo Sentinel + combinación:
Cuando a partir2Inicio de desplazamiento ,, entonces obtenemos21y23, (De1Fue cuando se atraviesa12) A continuación,21y12Al parecer repetidas combinaciones.

Cómo evitar la repetición de que esta combinación de problemas?

Primero exploramos por qué hay21Esta combinación se repite. Obviamente, debido a que atraviesan el punto de partida2antes de elementos1, Elemento antes de que el punto de partida si no atraviesan, para no repetir la combinación no aparece todavía? ¿Cómo hacerlo?

Se convierte en el punto de partida de debut en la circulación

Al variar el punto de partida del ciclo, es fácil asegurar que los elementos nunca antes recorridas punto de partida.

Vamos a explorar por qué la combinación con el código no utiliza Sentinel

El cambio restante después de sólo un ciclo de punto de partida a partir de atravesar varias mesas número de punto, por lo que la marca A y el marcador B temas abordados aquí no aparecen, es natural que no necesita un centinela. (Se omite).

Blanco producido, la bienvenida ala Gangster

Aquí Insertar imagen Descripción

Liberadas dos artículos originales · ganado elogios 0 · Vistas 31

Supongo que te gusta

Origin blog.csdn.net/SX123q/article/details/104793373
Recomendado
Clasificación