CSP-M1 C题

题意:
众所周知,瑞神已经达到了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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值