BFS: problemas de división Ray. c ++

Los rayos cósmicos se propagan sobre un plano de dos dimensiones inalámbrico (Fig puede ser considerado como una rejilla de dos dimensiones), la dirección hacia arriba por defecto inicial, los rayos cósmicos será emitida después de la división por una distancia de aproximadamente 45 ° hacia la dirección de la dirección de división dos rayos cósmicos, mientras que el poder de la misma. Los rayos cósmicos se dividirán n veces, cada vez longitudes de unidad de división ai hará avanzar en la dirección de la división. Por favor, calcular el número total de posiciones para ser golpeado.

De entrada de la primera línea de un número entero positivo n (n <= 30), n representa los rayos cósmicos se dividirán vistas. La segunda línea contiene n enteros a1, a2 ... un, i-ésimo dígitos ai (ai <= 5) representa el i-ésimo división del número de rayos cósmicos luego continuar tomando unidad de longitud en la dirección original.

La salida de un número de años, indican cuántas posiciones fueron a huelga.

entrada de la muestra:
4
4 2 2 3

salida de la muestra:
39

icono:

ideas:

  • Para todos los puntos, puede haber sólo ocho dirección de avance. Y un tiempo puede ser de 45 grados en sentido horario y en sentido contrario, que pueden corresponder a cualquiera de una dirección en sentido horario o en sentido contrario de conformidad con escritura x, el cambio y coordenadas, de modo que sólo un cambio de dirección de cada grabación, puede ser 8% 1 y -1 manera de obtener la dirección.
  • Bool puede utilizar una matriz de dos dimensiones hit [x] [y] para indicar si las coordenadas (x, y) para ser accedidos, el número de la última punto de golpe calculado para conseguir la respuesta
  • Utilice una amplia búsqueda de maneras de seguir llevando a cabo dos búsqueda recursiva para cada nodo rama
  • Si directamente de conformidad con las ideas anteriores, podemos más de cinco puntos el resto de los puntos a TLE, con el fin de reducir la complejidad del tiempo, ahora tenemos que programa de ciruela
  • La razón principal que consume demasiado tiempo es cuando se puede producir un gran número de puntos de tiempo durante cierto nivel, mientras que hay varias ramas para alcanzar el mismo punto, entonces para el mismo punto, diferentes ramas él será el último en irse, que dio lugar a una gran cantidad de redundancia. Por lo tanto crear una matriz de cuatro dimensiones, que se utiliza para indicar una dirección determinada en un cierto punto en una capa, si surgen los mismos puntos, directamente de.
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int dirx[8]={0,-1,-1,-1,0,1,1,1};
int diry[8]={1,1,0,-1,-1,-1,0,1};//一圈方便循环 
int ans=0;
int t[31];
int n;
bool hit[400][400]={false};
bool visit[31][400][400][8]; 
void digui(int now,int x,int y,int d)
{
	if(visit[now][x][y][d]==true)//降低复杂度 
	return;
	visit[now][x][y][d]=true;
	if(!hit[x][y])
	{
		hit[x][y]=true;
		ans++;
	}
	int temp_x=x,temp_y=y;
	for(int i=0;i<t[now]-1;i++)
	{
		temp_x+=dirx[d];
		temp_y+=diry[d];
		if(!hit[temp_x][temp_y])
		{
			hit[temp_x][temp_y]=true;
			ans++;
		}
	}
	if(now==n) return;//返回条件 
	int temp_d=(d+1)%8;//45
	digui(now+1,temp_x+dirx[temp_d],temp_y+diry[temp_d],temp_d);
	temp_d=(d+7)%8;
	digui(now+1,temp_x+dirx[temp_d],temp_y+diry[temp_d],temp_d);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>t[i];
	digui(1,200,200,0);//第一个的方向肯定是向上 
	cout<<ans;
	return 0;
}
Publicado 29 artículos originales · ganado elogios 1 · visitas 948

Supongo que te gusta

Origin blog.csdn.net/qq_44654498/article/details/104884548
Recomendado
Clasificación