CSP模擬 題目C 可怕的宇宙射線

2021-10-04 03:59:37 字數 2626 閱讀 9590

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

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

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

運用偏移陣列dx與dy,表示點**時可以延伸搜尋的方向

//偏移陣列 上 右上 右 下 左下 左 左上

int dx[8]

=;int dy[8]

=;

樸實的方法就是一般的dfs搜尋,規定搜尋邊界,設定好每個方向的搜尋之後讓dfs把到達過的點全部都插入到乙個集合中

set s;

for(

int i =

0; i < v[k]

; i++

)

set有自動去重的功能,將射線經過的座標插入set中,遍歷完成時set中的元素個數就是射線經過的點的個數

現在考慮剪枝的策略,如何剪枝,如何及時終止無用的dfs搜尋?

射線在不同時間段前進ai次後就會**,考慮到乙個射線i要**的時候,進行第k次**,**方向為ddx1 + ddy1,ddx2 + ddy2,

如果這個**點p已經有相同**次數k且**方向相同ddx1 + ddy1,ddx2 + ddy2,的射線i(i != j)經過,那麼射線i往後的所有路線j都已經走過一次了,可以不用再次訪問,實現乙個這樣的剪枝策略

為了剪枝就要有標記

用乙個四維陣列標記,乙個**點的座標,**點,是第幾次**,**的方向是什麼

bool mark[

300]

[300][

8][31

]=;//記錄乙個點在乙個座標上**時,如何**,第幾次**

這是補題,模擬的時候沒有寫,現在無時間限制的話,就可以考慮用偏移陣列來簡化**,以後多試試,改過乙個錯誤:之前的四維陣列標記中,標記的不是第k次**而是**的長度l,以為**後前進長度一樣的射線就可以剪枝了,但是這時錯的,因為每次**後前進的長度是不確定的,可能相等也可能不相等,如果遇到了不同的**次數ki kj,但是他們的前進長度確一樣的話v[ki] == v[kj],會錯誤的把一次搜尋回溯

dfs經過剪枝策略之後,就可以提高dfs的效率,防止dfs進行多餘的搜尋

#include

#include

#include

#include

using namespace std;

//偏移陣列 上 右上 右 下 左下 左 左上

int dx[8]

=;int dy[8]

=;int n;

int v[31]

;//射線行走長度

bool mark[

300]

[300][

8][31

]=;//記錄乙個點在乙個座標上**時,如何**,第幾次**

struct point

inline bool friend operator<

(const point & a,

const point & b)};

set s;

//乙個射線起點a,下一次**方向為ddx ddy,**方式為way,行走長度為v[k]

void

dfs(point a,

int ddx,

int ddy,

int way,

int k)

int _x = a.x;

int _y = a.y;

if(mark[_x]

[_y]

[way]

[k])

mark[_x]

[_y]

[way]

[k]= true;

for(

int i =

0; i < v[k]

; i++

)//**到其他兩個方向:

point b

(_x,_y)

;dfs

(b,dx[

(way +1)

%8],dy[

(way +1)

%8],

((way +1)

%8),k+1)

;dfs

(b,dx[

(way +7)

%8],dy[

(way +7)

%8],

((way +7)

%8),k+1)

;}intmain()

point start

(150

,150);

dfs(start,0,

1,0,

0);printf

("%d\n"

,s.size()

);return0;

}

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

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

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

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

C 可怕的宇宙射線

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