宇宙射線 c DFS

2021-10-03 20:47:54 字數 1874 閱讀 1608

題目

乙個射線,初始方向向上。一段時間後會**,向該方向的左右45度**2條射線。宇宙射線會**那次,每次會前進ai個單位長度。

輸入描述

第一行乙個正整數 n (n<=30),表示**n次

第二行包含n個正整數a1…an,分別表示在那個方向上會走多少個單位。

樣例輸入

44 2 2 3

樣例輸出

思路

我一開始用bfs寫,但是失敗了,後來改用dfs。

dfs有8個方向,分別為 上下左右,還有4個斜的方向。

那麼就每個方向**兩個方向,不停遞迴。

寫起來很容易,但是會超時。

所以需要優化,我用了個多維陣列記錄狀態進行優化。

**實現

#include

#include

#include

using

namespace std;

int b[50]

;int n;

set< pair<

int,

int>

> s;

bool j[

400]

[400][

35][9

]=;void

dfs(

int x,

int y ,

int bi,

int fx )

//bi是b的索引,fx是方向

dfs(x,y,bi+1,

5);dfs

(x,y,bi+1,

7);}

if(fx ==2)

//下

dfs(x,y,bi+1,

6);dfs

(x,y,bi+1,

8);}

if(fx ==3)

//左

dfs(x,y,bi+1,

5);dfs

(x,y,bi+1,

6);}

if(fx ==4)

//右

dfs(x,y,bi+1,

7);dfs

(x,y,bi+1,

8);}

if(fx ==5)

//左上

dfs(x,y,bi+1,

1);dfs

(x,y,bi+1,

3);}

if(fx ==6)

//左下

dfs(x,y,bi+1,

3);dfs

(x,y,bi+1,

2);}

if(fx ==7)

//右上

dfs(x,y,bi+1,

1);dfs

(x,y,bi+1,

4);}

if(fx ==8)

//右下

dfs(x,y,bi+1,

4);dfs

(x,y,bi+1,

2);}

}int

main()

收穫利用多維陣列記錄狀態,進行優化以便降低時間複雜度。

利用set,除去重複的點。

我一開想的優化演算法是,定義乙個3維的結構體,表示狀態,然後塞進set裡面,再利用set 的某個函式或許可以判斷是否來過這個狀態,但是居然編譯失敗,似乎是set自帶的排序功能惹的禍,但是我也過載了小於號的,不知道為什麼就是編譯失敗,於是只能選擇這種方法。

可怕的宇宙射線

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

C 可怕的宇宙射線

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

可怕的宇宙射線 dfs 剪枝

寫在前面 對於這個問題,首先我們可以採用暴力bfs或者dfs,但是這種演算法的複雜度是指數級的,如果考慮 30次,那麼它的迴圈次數是2 302 230,如果在正規比賽中肯定會超時,在詢問了大佬之後,這個問題可以採用dfs加上剪枝來解決,這裡和大家分享一下 在浩瀚的宇宙中,存在著1種生物,這種生物可以...