[Puente azul de la Copa] [VIP algoritmo de entrenamiento] palabra Solitaire (DFS + cadena)

Título Descripción
palabra Solitaire es una expresión usada para jugar con nuestros juegos similares solitario, y ahora sabemos por un conjunto de palabras, y se le dio una carta al principio, un requisito que comienza con la letra de los más largos "Dragón" (cada uno las palabras estén más aparecen en el "dragón" dos veces), cuando está conectado a dos palabras, lo que hace parte de las porciones superpuestas juntos, y bestia asombra por ejemplo, si está conectado al tren se convierte en beastonish, dos parte adyacente adicional no puede existir relación de inclusión, y por ejemplo, no se puede conectar entre al atide.

La descripción de la muestra
junto al "Dragón" es atoucheatactactouchoose

De entrada
de la primera entrada acto un solo número entero n (n <= 20) representa el número de palabras, cada uno de la fila n tiene una línea de palabra, la última fila de un único carácter de entrada, representa la letra "Dragón" al principio. Se puede asumir que esto comienza con el "dragón" carta debe existir.
Salida
más larga "dragón" de la longitud de salida sólo comienza con la letra de esta
entrada de la muestra
5
AT
táctil
de trucos
Elegir
TACT
Un
ejemplo de salida
23
las ideas: la cantidad de datos no es grande, entonces estamos en todas las búsquedas posibles. Debido a que se produce como máximo dos veces, por lo que añadir una cualificación. Aquí, he utilizado el tipo de cadena, tipo cadena de caracteres para la interceptación útil, sobre todo dentro de la función substr, no se puede entender su propia a Baidu.
Código es el siguiente:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=21;
string s[maxx];
int vis[maxx];
int n;

inline void dfs(string t,int &_max)
{
	if(t.length()>_max) _max=t.length();
	string gg,kk;
	for(int i=1;i<t.length();i++)
	{
		gg=t.substr(t.length()-i);
		for(int j=1;j<=n;j++)
		{
			kk=s[j].substr(0,gg.length());
			if(kk==gg&&vis[j]<2)
			{
				vis[j]++;
				dfs(t+s[j].substr(kk.length()),_max);
				vis[j]--;
			}
		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) cin>>s[i];
	char c[2];
	scanf("%s",c);
	int _max=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i][0]==c[0])
		{
			memset(vis,0,sizeof(vis));
			vis[i]++;
			dfs(s[i],_max);
		}
	}
	printf("%d\n",_max);
	return 0;
}

Para abastecerse de combustible ah, ( O ) / ~

Publicados 601 artículos originales · ganado elogios 51 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/starlet_kiss/article/details/105225945
Recomendado
Clasificación