第一次 csp考试模拟题 C题

可怕的宇宙射线题目:

题目描述:

众所周知,瑞神已经达到了CS本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在着一种叫做苟狗的生物,这种生物天生就能达到人类研究生的知识水平,并且天生擅长CSP,甚至有全国第一的水平!但最可怕的是,它可以发出宇宙射线!宇宙射线可以摧毁人的智商,进行降智打击!
宇宙射线会在无限的二维平面上传播(可以看做一个二维网格图),初始方向默认向上。宇宙射线会在发射出一段距离后分裂,向该方向的左右45°方向分裂出两条宇宙射线,同时威力不变!宇宙射线会分裂n 次,每次分裂后会在分裂方向前进 ai个单位长度。
现在瑞神要带着他的小弟们挑战苟狗,但是瑞神不想让自己的智商降到普通本科生那么菜的水平,所以瑞神来请求你帮他计算出共有多少个位置会被"降智打击"。

输入:

输入第一行包含一个正整数n(n<=30) ,表示宇宙射线会分裂n次。
第二行包含n个正整数a1,a2…an,第 i个数ai 表示第 i次分裂的宇宙射线会在它原方向上继续走多少个单位长度。

输出:

输出一个数 ans,表示有多少个位置会被降智打击。

样例输入:

4
4 2 2 3

样例输出

39

在这里插入图片描述

解题思路:(这道题是看着助教的ppt打的,不是很理解,说说我自己想的部分)
用二维数组去存坐标,用0,1分别表示没有、有被打击,数组的大小为
[31x5] [31x5]
由于分裂到后期,会出现八个不同的方向
在类似这样

==

#include<bits/stdc++.h>
using namespace std;
int vis[330][330][31][8],mp[330][330],n,a[35],ans;
int dir[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
void dfs(int x,int y,int cnt,int d)
{
 if(vis[x][y][cnt][d]) return;
 vis[x][y][cnt][d]=1;
 for(int i=1;i<=a[cnt];i++)
 {
  x+=dir[d][0],y+=dir[d][1];
  if(!mp[x][y]) ans++,mp[x][y]=1;
 }
 if(cnt<n) dfs(x,y,cnt+1,(d+1)%8),dfs(x,y,cnt+1,(d+7)%8);
}
int main()
{
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
  scanf("%d",&a[i]);
 dfs(160,160,1,2);
 printf("%d\n",ans);
 return 0;
}

==

发布了20 篇原创文章 · 获赞 0 · 访问量 233

猜你喜欢

转载自blog.csdn.net/GuaXX/article/details/104975764
今日推荐