CSP-Test-DFS gran analógica (Gimnasio - 101510B)

título DFS complejo analógico Italia (dirección CSP-T3)

Resumen del tema

narrativa tema

Dios de las cartas de juego suizos de vuelta a casa, las cosas amarga experiencia, decidió practicar la tecnología de tarjetas duro, y con el tiempo se convirtió en un Dios de jugadores!
A × B cosas allí jugando a las cartas. Cada tarjeta de juego tiene un tamaño (un entero, denotado por A, el rango es de 0 a la sección A - 1) y un color (entero, denotado es B, el intervalo de rango es de 0 a B - 1.
tarjetas son diferentes entre sí, y es único, que no hay dos cartas son del mismo tamaño y color.
significa "mano" que sus manos son cinco cartas diferentes, cinco cartas no hay cuestiones de orden después de que el ex quién es quién, pueden formar un tipo de tarjeta. definimos nueve tipo de tarjeta, tipo de tarjeta que son nueve tipos de reglas, utilizamos "número baja prioridad" para que coincida con el tipo de tarjeta, es decir, que la "mano" de arriba a abajo de los primeros en cumplir con el una regla de tipo de tarjeta es su "número de tipo de tarjeta" (una parte entero de 1 a 9): 1
ras: se reúnen regla 5 y la regla 4.
2 bomba:. 5 cartas que es igual al tamaño de la tarjeta de cuatro
3 III con dos: cinco cartas incluyendo el tamaño de la tarjeta es igual a 3, y aún más el tamaño de las dos tarjetas son iguales.
4 ras:. 5 cartas son del mismo palo
5 recta: 5 cartas del tamaño de la forma x , 1 + X, X + 2, X + 3, X + 4...
6 tres:. 5 cartas que es igual al tamaño de tres cartas.
7 dos pares: 5 Tarjetas de los cuales hay dos tarjetas Es igual a pequeña, y los otros tres cartas igual al tamaño de dos tarjetas.
8 un par:. 5 cartas que es igual al tamaño de dos tarjetas
9 para proporcionar: la mano no satisface cualquiera de un tipo de tarjeta.
ahora, a × B Este retirado de jugar a las cartas en la tarjeta 2! son (a1, b1) y (a2, b2). (que a representa una magnitud, b representa color)
ahora desde el resto del póquer tarjetas al azar de cada tres! componen de mano !!
De hecho, además de la materia (un código de número entero que va a estar jugando, de aficionados que era un mago, y ahora quiere predecir la probabilidad de su futuro, a saber, la posibilidad de que él conseguirá la "mano", utilizamos un "número de tipo tarjeta perteneciente 1-9) "para representar la mano del tipo de tarjeta, a continuación, sus nueve futuro posible, pero cada número de posibles soluciones no es lo mismo.
Ahora, motocicleta Hace materia Eye se ha ido, que necesita para ayudarle a hacer los cálculos nueve clases de tipo de tarjeta, el número de programa de cada tipo de tarjeta.

ENTRADA

Línea 1 contiene los enteros A y B (5 ≤ A ≤ 25, 1 ≤ B ≤ 4).
La línea 2 contiene los enteros a1, b1, a2, b2 ( 0 ≤ a1, a2 ≤ A - 1, 0 ≤ b1 , b2 ≤ B - 1, ( a1, b1) ≠ (a2, b2)).

SALIDA

línea de salida, esta línea tiene nueve números enteros, cada número entero representa el número nueve tipo de tarjeta de programa (por números de tipo tarjeta en orden ascendente)

entrada y salida de la muestra

Primer grupo:
muestra de entrada:

5 2
1 0 3 1

Resultado de muestra:

0 0 0 0 8 0 12 36 0

Grupo II:
Ejemplo de entrada:

4 25
0 0 24 3

Resultado de muestra:

0 2 18 0 0 644 1 656 36 432 113 344

Repetir título

Temas a simple vista cuando se ve en una típica grandes problemas de simulación: ajustes complicados, muchas escenas requieren un gran número de tipo rama, dirección y bajar a los temas de estudio de análisis de algoritmos núcleo.
Tachando escenas no deseadas, el problema se reduce a:
una magnitud numérica determinada marca y el número de colores, la cara de la señal dentro del rango puede ser seleccionado. 2 ahora se da superficie de la tarjeta, y seleccione las tres cartas restantes que forman una superficie de la placa (no duplicar cada selección de la tarjeta)
de la cara de la señal obtenida, dividida en nueve categorías. Requiere el cálculo de todas las tarjetas de la cara de conseguir, y contar el número nueve tipos de tarjetas aparecen cara

Ideas de resolución de problemas

A través del análisis del significado del título, se puede observar tarea general en dos partes:
1, para dar todos los valores posibles de la cara de la señal
2, se clasifican de acuerdo con la cara de la señal y contar el número de

Tarea 1 Solución:

Señala que se requiere el título a atravesar toda la cara de la señal, cuando se trata de atravesar claramente se puede determinar a DFS o BFS algoritmo anterior. Desde requerida durante el recorrido a través de todas las circunstancias necesarios para determinar la cara de la señal y su tipo, para facilitar el almacenamiento de los datos, la selección de DFS puede ser más simple y codificación eficaz.
(Si utiliza BFS, a los nodos de emisión pre-almacenado, etc., mayor carga de trabajo y de la probabilidad de error)

Tarea dos soluciones:

Análisis de los nueve tipos de cartas boca podemos obtener el siguiente análisis:
clasificación de sólo dos colores: Escalera y de la flor inusual
tiene dos dimensiones en la clasificación de los valores:
1, si las cinco cartas es una recta
2, si no es recta , hay cuántos de tipo duplicado de la tarjeta
análisis requiere claramente la clasificación solamente una simple operación se puede completar:
un juicio pesada - ya sea al ras: cinco tarjetas de visitas de salto de color para completar
el doble juicio - ya sea recta: utilizar el tipo STL () para clasificar, y luego determinar si el tamaño de los cinco valores de incremento por etapas 1 a
Triple juicio - si no es recta, inicializar una matriz de estadísticas cuentan el número de ocurrencias de cada valor, rama puntos de escritura puede ser resuelto.

resumen

Título de la simulación grande, el título puede parecer difícil de entender, es muy complejo y difícil, fácilmente trae miedo psicológico. Sin embargo, si es capaz de hundirse en el corazón, un análisis cuidadoso del significado de los problemas, el algoritmo de núcleo y otras tareas despegó, dividido en módulos resuelve todo resuelto.

título de la fuente

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int num=0;//要处理的数字个数
int col=0;//要处理的花色个数
struct card
{
    int number;
    int color;
    bool operator<(card & a)
    {
    	return number<a.number;
	}
}cards[5];
int vis [26][5];
int cont=0;
int list[9];
int number_list[26];
void critize(card cin_card[5])
{
	cont++;
	int col_flag=1;
	int num_flag=0;
	int flag_3=0;
	int flag_2=0;
	int col_1=cin_card[0].color;
	card card_copy[5];
	for(int i=0;i<5;i++)
	{
		card_copy[i].number=cin_card[i].number;
		card_copy[i].color=cin_card[i].color;
	}
	sort(card_copy,card_copy+5);
	/*for(int i=0;i<5;i++)
	{
		cout<<card_copy[i].number<<" "<<card_copy[i].color<<endl;
	}*/
	if(card_copy[0].number==card_copy[1].number-1 && card_copy[1].number==card_copy[2].number-1 && card_copy[2].number==card_copy[3].number-1 && card_copy[3].number==card_copy[4].number-1)
	num_flag=5;
	for(int i=0;i<num;i++)
	{
		number_list[i]=0;
	 } 
	for(int i=0;i<5;i++)
	{
		if(card_copy[i].color!=col_1)
		{
			col_flag=0;
		}
		number_list[card_copy[i].number]++;
	}
	for(int i=0;i<num;i++)
	{
		if(number_list[i]==2)
		{
			flag_2++;
		}
		else if(number_list[i]==3)
		{
			flag_3++;
		}
		else if(number_list[i]==4)
		{
			num_flag=4;
			break;
		}
	}
	if(num_flag==5 && col_flag==1)
	{
	list[0]++;
	return;
	}
	if(num_flag==4)
	{
	list[1]++;
	return;
	}
	if(flag_2==1 && flag_3==1)
	{
		list[2]++;
		return;
	}
	if(col_flag==1)
	{
		list[3]++;	
		return;
	}
	if(num_flag==5)
	{
		list[4]++;
		return;
	}
	if(flag_3==1)
	{
		list[5]++;	
		return;
	}
	if(flag_2==2)
	{
		list[6]++;
		return;
	}
	if(flag_2==1)
	{
		list[7]++;
		return;
	}
	list[8]++;
}
void DFS(int step)
{
	for(int i=0;i<num;i++)
		for(int j=0;j<col;j++)
		{
			int dx=i;
			int dy=j;
			if(vis[dx][dy]==0)
			{
				step++;
				cards[step].number=dx;
				cards[step].color=dy;
				vis[dx][dy]=1;
				if(step==4)
				{
					critize(cards);
				}
				else
				{	 
				DFS(step);
				} 
				step--;
				vis[dx][dy]=0; 
			}			
		}	
}
int main()
{
    cin>>num>>col;
    int a1,b1,a2,b2=0;
    cin>>a1>>b1;
    cin>>a2>>b2;
    cards[0].number=a1;
    cards[0].color=b1;
    cards[1].number=a2;
    cards[1].color=b2;
    for(int i=0;i<num;i++)
    	for(int j=0;j<col;j++)
    		vis[i][j]=0;
    vis[a1][b1]=1;
    vis[a2][b2]=1;
    /*for(int i=0;i<num;i++)
    {
    	for(int j=0;j<col;j++)
    	{
    		cout<<vis[i][j]<" ";
		}
		cout<<endl;	
	}*/
	for(int i=0;i<9;i++)
	list[i]=0;
	DFS(1);
	for(int i=0;i<9;i++)
	{
		cout<<list[i]/6<<endl;
	}
	return 0;
}
Publicado 17 artículos originales · ganado elogios 2 · Vistas 1655

Supongo que te gusta

Origin blog.csdn.net/qq_43942251/article/details/105161392
Recomendado
Clasificación