CSP M1 C 可怕的宇宙射線

2021-10-04 03:59:38 字數 4342 閱讀 2023

題目描述

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

宇宙射線會在無限的二維平面上傳播(可以看做乙個二維網格圖),初始方向預設向上。宇宙射線會在發射出一段距離後**,向該方向的左右45°方向**出兩條宇宙射線,同時威力不變!宇宙射線會**n次,每次**後會在**方向前進a[i]個單位長度。

現在瑞神要帶著他的小弟們挑戰苟狗,但是瑞神不想讓自己的智商降到普通本科生zjm那麼菜的水平,所以瑞神來請求你幫他計算出共有多少個位置會被"降智打擊"

輸入第一行包含乙個正整數

n(n<=30),表示宇宙射線會**n次

第二行包含n個正整數

a[1],a[2]…a[n],第i個數a[i] (a[i]<=5)表示第i次**的宇宙射線會在它原方向上繼續走多少個單位長度。

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

44 2 2 3

資料點n

此題是乙個深搜題,但是由於**次數最大為30次,為2的30次方,資料量巨大,不可暴力求解,於是採用圖論中經常用到的一種方法,標記法,對已經走過的點進行標記,使用乙個dir結構來記錄每個點的狀態(域為乙個二維陣列,第一維是方向,第二位是第幾次**(**的次數決定了移動的長度)),如果某一點的方向和**次數均相同,則可直接返回,因為方向和次數一樣表示本次及以後所有的**方向和移動的步數全部相同,為減少複雜度可直接返回。

#include

#include

#include

#include

using

namespace std;

int count1 =0;

struct dir}}

;void

reach

(int**

,int

,int*,

int,

int,

int,

int, dir**)

;int

main()

int*

* a =

newint*[

2* size +1]

; dir*

* a1 =

new dir *[2

* size +1]

;for

(int i =

0; i <

2* size +

1; i++

)for

(int i =

0; i <

2* size +

1; i++

)for

(int j =

0; j <

2* size +

1; j++

) a[i]

[j]=0;

int row = size, col = size;

reach

(a,0

, b, n, row, col,

0, a1)

;/*for (int i = 0; i < 2 * size + 1; i++)

*/ cout << count1 << endl;

return0;

}void

reach

(int

** a,

int num,

int b,

int n,

int r,

int c,

int d, dir*

* a1)

//d為方向 向上為0,順時針標記剩下7個方向

} a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r - b[num]

, c,

(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r - b[num]

, c,

(d +8-

1)%8

, a1);}

else

if(d ==1)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r - b[num]

, c + b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r - b[num]

, c + b[num]

,(d +8-

1)%8

, a1);}

else

if(d ==2)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r, c + b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r, c + b[num]

,(d +8-

1)%8

, a1);}

else

if(d ==3)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r + b[num]

, c + b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r + b[num]

, c + b[num]

,(d +8-

1)%8

, a1);}

else

if(d ==4)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r + b[num]

, c,

(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r + b[num]

, c ,

(d +8-

1)%8

, a1);}

else

if(d ==5)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r + b[num]

, c - b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r + b[num]

, c - b[num]

,(d +8-

1)%8

, a1);}

else

if(d ==6)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r , c - b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r, c - b[num]

,(d +8-

1)%8

, a1);}

else

if(d ==7)

a1[r]

[c].a[d]

[num]=1

;reach

(a, num +

1, b, n, r - b[num]

, c - b[num]

,(d +8+

1)%8

, a1)

;reach

(a, num +

1, b, n, r - b[num]

, c - b[num]

,(d +8-

1)%8

, a1);}

}

CSP M1 C 可怕的宇宙射線 dfs剪枝

宇宙射線在二維平面內傳播,一段距離後向左右45 威力不變。宇宙射線會 n次,每次 後前進ai個單位再 計算共有多少二維平面內的點受到宇宙射線的攻擊。第一行 次數 n n 30 第二行 n個數,第i個數ai表示第i次 後前進的距離,ai 5 乙個數ans,表示共有ans個點被攻擊 每乙個點的狀態有橫座...

C 可怕的宇宙射線

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

可怕的宇宙射線

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