題目描述
眾所周知,瑞神已經達到了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 ...