宇宙射線在二維平面內傳播,一段距離後向左右45°**,威力不變。宇宙射線會**n次,每次**後前進ai個單位再**。計算共有多少二維平面內的點受到宇宙射線的攻擊。
第一行:**次數 n(n<=30)
第二行:n個數,第i個數ai表示第i次**後前進的距離,ai<=5
乙個數ans,表示共有ans個點被攻擊
每乙個點的狀態有橫座標、縱座標、**次數、前進方向四個特徵,使用bool型四維陣列vis[x][y][k][d]記錄狀態,1表示經過這個狀態,0表示沒有經過。採用dfs遞迴搜尋,轉移方式用dx,dy,map>mp完成,每個方向用0-7的乙個數字表示,dx、dy為該方向的橫、縱座標變化量,mp將乙個方向對映到左右45°的兩個方向。dfs的傳入引數為橫座標x,縱座標y,**次數cnt,前進方向dir。**次數為0—n-1,若cnt=n,遞迴結束。若(x,y,cnt,dir) 這個狀態的vis為1,即在同一輪**的同一方向已經搜尋過該點,則不必再重複搜尋(剪枝),遞迴結束。否則,將該狀態對應的vis標記為1,做m次轉移(m為該輪**的前進步數),將每次轉移後經過的點加入乙個set(set可以去重)。遞迴搜尋下乙個狀態,下乙個狀態的橫、縱座標為m次轉移後的橫、縱座標,方向為將當前方向利用mp對映後的兩個方向,**次數+1。遞迴結束後,set中的元素數即為結果。
—wa
int dx=;// 上 右上 右 右下 下 左下 左 左上
int dy=;// 0 1 2 3 4 5 6 7
map> mp=} , } , } , } ,
} , } , } , }
};
—mle、tle
題意中的次次**很容易聯想到像波紋那樣層層擴充套件的bfs,純裸bfs結束時佇列中有元素2^n+1個,導致mle。即便最後一層的節點不加入佇列,佇列中元素最多時有2^(n-1)個,n=30時佇列中最多有512×1024×1024個點,mle。
嘗試應用同樣的vis四維陣列去重,tle。
bfs常用於找單一的最短路徑,搜到就是最優解(迷宮、倒水)。dfs用於找問題的所有解(八皇后、宇宙射線、選數),空間效率高,找到的不一定是最優解,需要高效的剪枝。
#include#include#include#include#includeusing namespace std;
int num[35];//第i次**的步數
int n;//**數 0-n-1
bool vis[305][305][31][8];//座標(i,j) 第k次** 目前方向為l
int dx=;// 上 右上 右 右下 下 左下 左 左上
int dy=;// 0 1 2 3 4 5 6 7
int sx=150,sy=149;//起始點的前驅
map> mp=} , } , } , } , } , } , } , }
};struct point
bool operator
{ return x==p.x ? ys;
void dfs(int x,int y,int cnt,int dir)//座標(x,y) 將要執行第cnt次** 目前的方向為dir
CSP M1 C 可怕的宇宙射線
題目描述 眾所周知,瑞神已經達到了cs本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在著一種叫做苟狗的生物,這種生物天生就能達到人類研究生的知識水平,並且天生擅長csp,甚至有全國第一的水平!但最可怕的是,它可以發出宇宙射線!宇宙射線可以摧毀人的智商,進行降智打擊!宇宙射線會在無限的...
C 可怕的宇宙射線
宇宙射線會在無限的二維平面上傳播 可以看做乙個二維網格圖 初始方向預設向上。宇宙射線會在發射出一段距離後 向該方向的左右45 方向 出兩條宇宙射線,同時威力不變!宇宙射線會 n 次,每次 後會在 方向前進 ai個單位長度。求有多少個位置會被打擊。輸入第一行包含乙個正整數n n 30 表示宇宙射線會 ...
可怕的宇宙射線
題意 宇宙射線會在無限的二維平面上傳播 可以看做乙個二維網格圖 初始方向預設向上。宇宙射線會在發射出一段距離後 向該方向的左右45 方向 出兩條宇宙射線,同時威力不變。宇宙射線會 n次,每次 後會在 方向前進ai 個單位長度。計算出共有多少個位置會被打擊。輸入 輸入第一行包含乙個正整數n n 30 ...