题意:
众所周知,瑞神已经达到了CS本科生的天花板,但殊不知人外有人,人外有苟。在浩瀚宇宙中,存在着一种叫苟狗的生物,这种生物天生就能达到人类研究生的知识水平,并且天生擅长CSP,甚至有全国第一的水平。但是最可怕的是,它可以发出宇宙射线,宇宙射线可以摧毁人的智商,进行降智打击。宇宙射线会在无限的二维平面上传播(可以看作一个二维网格图),初始方向默认向上。宇宙射线会在发射出一段距离后进行分裂,向该方向的左右45度方向分裂出两条宇宙射线,同时唯理不变。宇宙射线分裂n次,每次像分裂方向前进ai个单位长度。现在瑞神要带着他的小弟们挑战苟狗,但是瑞神不想让自己的智商降到普通本科生zjm那么菜的水平,所以瑞神请求你帮他计算出共有多少个位置会被降智打击。
input:
输入n,表示宇宙射线会分裂n次
输入n个整数,a1,a2…an,表示宇宙射线会在它分裂后方向上继续走ai个单位长度。
output:
输出多少个位置会被降智打击。
sample input:
4
4 2 2 3
sample output:
39
思路:
这个跟之前走迷宫的思路有点像,但简单一点点。通过如果输入的四维数组b的值为1或遍历完成的话则跳出函数。在小于所需分裂的次数时进行循环判断,在x,y方向进行各自分裂后的该变量进行x,y的更新。并对走过的点还未被标记过时,对这个点进行标记,count的值也增加,通过递归,向两个不同的分裂方向进行再一次的判断。
代码:
#include<iostream>
using namespace std;
int disx[]={0,-1,-1,-1,0,1,1,1};
int disy[]={1,1,0,-1,-1,-1,0,1};
int count=0;
int a[400][400];
int n;
int b[400][400][30][8]={0};
int step[30];
void dfs(int dir,int num,int x,int y)
{
if(b[x][y][num][dir]==1||num==n)
{
return;
}
b[x][y][num][dir]=1;
for(int i=0;i<step[num];i++)
{
x+=disx[dir];
y+=disy[dir];
if(!a[x][y])
{
a[x][y]=1;
count++;
}
}
dfs((dir+1)%8,num+1,x,y);
dfs((dir+7)%8,num+1,x,y);
}
int main()
{
//int n;
cin>>n;
//int a[n];
for(int i=0;i<n;i++)
{
cin>>step[i];
}
int dir=0;
int x=200;
int y=200;
int num=0;
dfs(dir,num,x,y);
//dfs(200,200,0,0);
cout<<count;
return 0;
}