[Puente azul de la Copa] [2015 Sexta Zhenti] torre de robot (DFS)

Título Descripción
robot de Planeta X tiene dos actuaciones porristas ropa, A y B.
Muestran que los robots tomen la torre.

similar:

 A
B B

ABA
AABB
BBBAB
ababba

Torre Grupo gobierna equipo es:

Un hombro sólo puede soportar de AA o BB.
B puede estar parado en los hombros de la AB o BA.

Su tarea es ayudar a los animadores calculan, cuando el número de B dado A, cuántos trucos pueden estar compuestos de la torre.

Entrada de línea dos enteros M y N, separados por espacios (0 <M, N <500), respectivamente, representan el número de A, B, para asegurar el número de racionalidad.

Un número entero de salida requerida representa el número de tipos de patrones se pueden generar.
De entrada
de línea de entrada dos enteros M y N, separados por espacios (0 <M, N <500 ), respectivamente, representan el número de A, B, para asegurar el número de racionalidad.
Output
requiere la salida un entero que representa el número de tipos de patrones se pueden generar.
Muestra de entrada
12
de salida de la muestra
3
Ideas: Partimos de arriba hacia abajo análisis, para las cadenas de la orden de la línea, si se determina el comienzo, a continuación, este último también determinada, y por lo tanto clasificado discusiones sobre el mismo.
Código es el siguiente:

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

int n,m;

inline ll dfs(int a,int b,int len,string s)
{
	if(a==0&&b==0) return 1ll;
	if(len==0) return dfs(a-1,b,1,"A")+dfs(a,b-1,1,"B");
	else
	{
		string t="";
		int c=a,d=b;
		ll sum=0;
		if(s[0]=='A') 
		{
			if(c>=2)
			{
				t+="AA";c-=2;
				for(int i=1;i<s.length();i++) 
				{
					if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
					else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
				}
				if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
				c=a,d=b,t="";
			}
			if(d>=2)
			{
				t+="BB";d-=2;
				for(int i=1;i<s.length();i++) 
				{
					if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
					else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
				}
				if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
				c=a,d=b,t="";
			}
		}
		c=a,d=b,t="";
		if(s[0]=='B')
		{
			if(c&&d)
			{
				t+="AB";c--,d--;
				for(int i=1;i<s.length();i++) 
				{
					if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
					else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
				}
				if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
				c=a,d=b,t="";
				t+="BA";c--,d--;
				for(int i=1;i<s.length();i++) 
				{
					if(s[i]=='A'&&t[i-1]=='A'&&c) t+='A',c--;
					else if(s[i]=='A'&&t[i-1]=='B'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='A'&&d) t+='B',d--;
					else if(s[i]=='B'&&t[i-1]=='B'&&c) t+='A',c--;
				}
				if(t.length()==len+1) sum+=dfs(c,d,len+1,t);
				c=a,d=b,t="";
			}
		}
		return sum;
	}
}
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		printf("%lld\n",dfs(n,m,0,""));
	}
	return 0;
}

Para abastecerse de combustible ah, ( O ) / ~

Publicados 599 artículos originales · ganado elogios 49 · Vistas a 40000 +

Supongo que te gusta

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