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;
}