BFS: problemas de divisão Ray. c ++

Os raios cósmicos propagar ao longo de um plano bidimensional sem fios (Fig pode ser considerado como uma rede bidimensional), o sentido ascendente padrão inicial, raios cósmicos irá ser emitido depois de divisão por uma distância de cerca de 45 ° para a direcção da direcção de divisão dois raios cósmicos, enquanto a alimentação do mesmo. Os raios cósmicos vai dividir n vezes, cada vez comprimentos unitários divisão ai vai avançar na direcção da divisão. Por favor, calcule o número total de cargos a serem atingidos.

De entrada da primeira linha de um inteiro positivo n (n <= 30), n representa raios cósmicos vai dividir vistas. A segunda linha contém n inteiros a1, a2 ... an, i-th dígitos ai (ai <= 5) representa o i-ésimo divisão do número de raios cósmicos irá depois continuar a tomar unidade de comprimento na direcção inicial.

A saída de um número ans, indicam quantas posições foram a greve.

entrada de amostra:
4
4 2 2 3

saída da amostra:
39

icon:

ideias:

  • Para todos os pontos, pode haver apenas oito frente. E uma vez que pode ser de 45 graus no sentido horário e anti-horário, que pode corresponder a qualquer um dos ponteiros do relógio ou anti-sentido de acordo com x gravação, mudança coordenadas y, de modo que apenas uma mudança de direcção de cada gravação, que pode ser de 8% 1 e -1 maneira de obter a direcção.
  • Bool pode utilizar um hit matriz bidimensional [x] [y] para indicar se as coordenadas (x, y) para ser acessado, o número do último ponto de vida calculado para obter a resposta
  • Use uma ampla busca de maneiras de continuar a realizar dois pesquisa recursiva para cada nó ramo
  • Se diretamente de acordo com as idéias acima, podemos mais de cinco pontos o resto dos pontos vai TLE, a fim de reduzir a complexidade do tempo, precisamos agora de programa de ameixa
  • A principal razão que consome muito tempo é, quando pode ocorrer um grande número de pontos de tempo durante certo nível, enquanto existem vários ramos para alcançar o mesmo ponto, então, para o mesmo ponto, diferentes ramos ele será o último a ir, ele levou a um monte de redundância. Assim, criar uma matriz de quatro dimensões, usado para indicar uma determinada direcção a um certo ponto em uma camada, se os mesmos pontos surgir, directamente para fora da.
#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 artigos originais · ganhou elogios 1 · vista 948

Acho que você gosta

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