csp-m1 补题c 可怕的宇宙射线

题目

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

在这里插入图片描述

时间内存限制

每个测试点 1000ms 262144KB

输入样例

4
4 2 2 3

输出样例

39

测试点说明

10% n<=10
20% n<=20
30% n<=30


思路分析

数据结构

int dx[8]={1,1,0,-1,-1,-1,0,1},
dy[8]={0,1,1,1,0,-1,-1,-1};
在xoy坐标平面取x、y轴及其所夹的中间分割线作为射线传播的八个方向,以x轴正方向为0沿逆时针增加,dx、dy数组记录沿0-7方向移动一个单位距离坐标的变化
bool ditu[400][400]: 存储地图上该点是否被射线传播到
bool biaoji[400][400][31][8]:用于存储每次射线分裂所在地图的位置、方向和属于第几次分裂
int a[40]:存储每次分裂后的步数

解法

step1:将分裂次数和每次分裂所前进步数分别录到n和a[i]中
step2:调用递归函数 chuanbo(2,200,200,1);当biaoji[x][y][i][fx]=1时表示从该点之后的分裂在其他分支的分裂中已经遍历过,若继续沿该路进行分裂所经过地点均已被标记,属于重复工作,故通过return进行剪枝,当biaoji[x][y][i][fx]=0时转到step3
step3:置 biaoji[x][y][i][fx]=1 沿fx一步一步地移动a[i]个单位,判断经过的点曾经是否被到达,在没有被到达时,将该点标记为被到达,同时为sum记录的被射线经过的点数+1。判断此时传入函数的分裂次数值是否=n,在=n时return,!=n时转到step4
step4:分别调用递归函数 chuanbo((fx+7)%8,x,y,i+1)和 chuanbo((fx+1)%8,x,y,i+1),表示将射线沿分裂方向行进,同时增加一次分裂次数。


错误记录

1、误认为-1%8=7,实际为-1!!!!!应将其改为+7%8
2、要进行剪枝:对在同一点、往同一方向且位于同样的分裂次数的点进行剪枝


代码

#include<iostream>
#include<stdio.h> 
using namespace std;
int dx[8]={1,1,0,-1,-1,-1,0,1},
 dy[8]={0,1,1,1,0,-1,-1,-1};
bool ditu[400][400]; 
bool biaoji[400][400][31][8];
int a[40];
int sum=0,n;
void chuanbo(int fx,int x,int y,int i)
{
 if(biaoji[x][y][i][fx])
  return;
 biaoji[x][y][i][fx]=1;
 for(int j=0;j<a[i];j++)
 {
  x=x+dx[fx];
  y=y+dy[fx];
  if(ditu[x][y]==0)
  {
   sum++;
   ditu[x][y]=1;
  }
 }
 if(i==n)
  return; 
 else 
 {
 chuanbo((fx+7)%8,x,y,i+1);
 chuanbo((fx+1)%8,x,y,i+1);  
 } 
}
int main()
{
 cin>>n;
 for(int i=1;i<=n;i++)
  scanf("%d",&a[i]);
 chuanbo(2,200,200,1);
 cout<<sum<<endl;
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值