眾所周知,瑞神已經達到了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 表示宇宙射線會 ...