題目
乙個射線,初始方向向上。一段時間後會**,向該方向的左右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種生物,這種生物可以...