C 可怕的宇宙射線(Week4CSP模擬)

2021-10-03 20:21:03 字數 3207 閱讀 7325

眾所周知,瑞神已經達到了cs本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在著一種叫做苟狗的生物,這種生物天生就能達到人類研究生的知識水平,並且天生擅長csp,甚至有全國第一的水平!但最可怕的是,它可以發出宇宙射線!宇宙射線可以摧毀人的智商,進行降智打擊!

宇宙射線會在無限的二維平面上傳播(可以看做乙個二維網格圖),初始方向預設向上。宇宙射線會在發射出一段距離後**,向該方向的左右45°方向**出兩條宇宙射線,同時威力不變!宇宙射線會** 次,每次**後會在**方向前進ai個單位長度。現在瑞神要帶著他的小弟們挑戰苟狗,但是瑞神不想讓自己的智商降到普通本科生zjm那麼菜的水平,所以瑞神來請求你幫他計算出共有多少個位置會被"降智打擊"。

時間記憶體限制

每個測試點 1000ms 262144kb

輸入說明

輸入第一行包含乙個正整數 n(n<=30),表示宇宙射線會**n 次

第二行包含n個正整數a1,a2···an ,第ai 個數表示第 i次**的宇宙射線會在它原方向上繼續走多少個單位長度

輸出說明

輸出乙個數ans ,表示有多少個位置會被降智打擊

輸入樣例

4

4 2 2 3

12

輸出樣例
39

1

測試點說明

10% n<=10

20% n<=20

30% n<=30

1、這個題的整體思路是我們可以模擬射線**過程,當射線到達乙個原來沒有到達的地方時,ans++記錄。

2、可以利用遞迴實現,每乙個射線會**出兩個新的射線,其中射線步數與層數有關,射線方向與上一層射線有關。

·射線步數可以通過遞迴時傳引數實現,每進行一次遞迴,層數cnt+1

·射線方向通過flag來判斷,每乙個方向對應flag陣列中的下標索引1-8

char flag=;

3、 射線發射的地方開始遞迴,射線先前進一定距離,然後分散成兩個方向,不斷遞迴。

1、如果用普通深搜遞迴方式,函式時間複雜度是指數級的,容易tle或者mle,這道題只能拿到40%的分數。因此要利用乙個四維陣列剪枝

2、注意每一條射線的上下或左右端點的記錄,尤其是最後一層的最後乙個點,容易遺漏。

3、注意啟示射線的起點位置

關於射線方向問題:

剛開始決定用遞迴寫,發現共有八種方向的射線要討論,與一般遞迴不同,這次的引數並沒有非常明顯的規律,例如不斷加一或減一。所以剛開始我的**遞迴部分是這樣的:

pair<

int,

int>

u(x,y);if

(flag==1)

//up

else

if(flag==2)

//down

else

if(flag==3)

//upr

else

if(flag==4)

//upl

else

if(flag==5)

//lelse

if(flag==6)

//relse

if(flag==7)

//dor

else

if(flag==8)

//dol

有點暴力,但是確實很清晰,通過flag判斷當前射線的方向,進而進行該射線**後兩個射線的遞迴。

但是,**確實有些冗餘,感覺不好看。所以,我繼續找射線方向之間的關係,試圖用兩個陣列來解決(ddx,ddy)。最後根據分析可得:

char flag=

;//當做注釋,與下面ddx,ddy對應

const

int ddx=

;const

int ddy=

;

例如:

upr->up和r

r->upr和dor

在上面flag陣列中可以發現,每個射線**得到的新的兩個射線方向剛好是原射線方向在陣列中前後對應的方向。那麼上面暴力的八個if語句就可以轉換成上面兩個陣列形式。

(以後寫**可以先寫出乙個比較暴力的形式,再不斷改進)

#include

using

namespace std;

int n,ans;

int a[50]

;mapint,

int>

,int

> mp;

bool judge[

400]

[400][

35][8

]=;char flag=

;//當做注釋,與下面ddx,ddy對應

const

int ddx=

;const

int ddy=

;void

boom

(pair<

int,

int> p,

int cnt,

int dx,

int dy,

int flag)

int x=p.first;

int y=p.second;

if(judge[x]

[y][cnt]

[flag]

) judge[x]

[y][cnt]

[flag]

=true

;for

(int i=

0;i;i++)}

pair<

int,

int>

u(x,y)

;boom

(u,cnt+

1,ddx[

(flag+7)

%8],ddy[

(flag+7)

%8],

(flag+7)

%8);

boom

(u,cnt+

1,ddx[

(flag+1)

%8],ddy[

(flag+1)

%8],

(flag+1)

%8);

}int

main()

pair<

int,

int>p(

200,

200)

;boom

(p,0,0

,1,0

);cout

}

week4 CS C 可怕的宇宙射線

問題描述 宇宙射線會在無限的二維平面上傳播 可以看做乙個二維網格圖 初始方向預設向上。宇宙射線會在發射出一段距離後 向該方向的左右45 方向 出兩條宇宙射線,同時威力不變。宇宙射線會 n次,每次 後會在 方向前進ai 個單位長度。計算出共有多少個位置會被打擊。輸入 輸入第一行包含乙個正整數n n 3...

C 可怕的宇宙射線

宇宙射線會在無限的二維平面上傳播 可以看做乙個二維網格圖 初始方向預設向上。宇宙射線會在發射出一段距離後 向該方向的左右45 方向 出兩條宇宙射線,同時威力不變!宇宙射線會 n 次,每次 後會在 方向前進 ai個單位長度。求有多少個位置會被打擊。輸入第一行包含乙個正整數n n 30 表示宇宙射線會 ...

Week4 CSP模擬 C 可怕的宇宙射線

過程總結 眾所周知,瑞神已經達到了cs本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在著一種叫做苟狗的生物,這種生物天 生就能達到人類研究生的知識水平,並且天生擅長csp,甚至有全國第一的水平!但最可怕的是,它可以發出宇宙射線!宇宙射線可以摧毀 人的智商,進行降智打擊!宇宙射線會在無...