可怕的宇宙射線

2021-10-03 19:03:56 字數 2771 閱讀 6768

題意:

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

輸入:

輸入第一行包含乙個正整數n(n <= 30),表示宇宙射線會**n次,第二行包含n個正整數a1,a2…an,第i個數ai(ai <= 5)表示第i次**的宇宙射線會在它原方向上繼續走多少個單位長度。

輸出:

輸出乙個數ans,表示有多少個位置會被降智打擊。

輸入樣例:

44 2 2 3

輸出樣例:

39解題思路:

這道題目思路非常清晰,一定可以使用遞迴完成。於是理清楚思路開始寫遞迴函式solve。solve函式倒是挺容易寫出來的,注意用乙個陣列來儲存每一次**前行走的路程,乙個num用來幫助判斷遞迴結束的條件。然後對每個方向進行分類討論,往set中插入點的下乙個座標(set可以自動去重複)。這一次**前的路程走完了很自然的遞迴呼叫solve(cx, cy, (d+7)%8, num+1)與 solve(cx, cy, (d+1)%8, num+1)繼續往左右45度角兩個方向繼續前進,最後只需要輸入set的size即可,到此程式完美結束。可惜只能過一半的評測點,另一半會超時。然後我們發現兩次遞迴中其實可以減少一次遞迴,因為左右是對稱的,我們只需要dfs到頭再回溯到起點,這個過程中利用對稱的性質不斷將點對稱便可以得到所有點的座標。無論選擇一直向右還是一直向左我們都只需要呼叫一次solve函式進行遞迴即可。注意改進後的程式需要首先dfs到頭,故要先遞迴呼叫一次solve,然後對set中所有點對稱,然後再對這一次應該經過的路徑加在set中。對稱的座標變換公式很容易由初中數學知識進行推導,總共只有四種對稱的情況。

注意事項:

1、按照d(方向引數)分類討論太傻了,直接用偏移量陣列會使程式更簡潔一些。

2、如果預設起點座標為(0,0),那麼第一次呼叫函式應該是solve(0, -1, 0, 1),因為(0,-1)不會被記錄到set中,但這並不妨礙大局。因為圖上點的座標是我們認為指定的,即使使用solve(0, 0, 0, 1)也只是代表圖中起點為(0,1)而已,set的size不變,只是具體座標改變。

總結:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int a[40]

;setint,

int>

> s;

int n;

void

solve

(int cx,

int cy,

int d,

int num)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==1)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==2)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==3)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==4)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==5)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==6)

solve

(x2, y2,

(d+7)%

8, num+1)

;}if(d==7)

solve

(x2, y2,

(d+7)%

8, num+1)

;}for(setint,

int>

>

::iterator it=s.

begin()

; it!=s.

end(

); it++)if

(d==

2||d==6)

if(d==

1||d==5)

if(d==

3||d==7)

} x=a[num];if

(d==0)

}if(d==1)

}if(d==2)

}if(d==3)

}if(d==4)

}if(d==5)

}if(d==6)

}if(d==7)

}}intmain()

solve(0

,-1,

0,1)

; cout

}

C 可怕的宇宙射線

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

可怕的宇宙射線 dfs 剪枝

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

CSP模擬 題目C 可怕的宇宙射線

眾所周知,瑞神已經達到了cs本科生的天花板,但殊不知天外有天,人外有苟。在浩瀚的宇宙中,存在著 種叫做苟狗的生物,這種生物天生就能達到人類研究生的知識水平,並且天生擅長csp,甚至有全國第一的水平 但最可怕的是,它可以發出宇宙射線 宇宙射線可以摧毀人的智商,進行降智打擊 宇宙射線會在無限的二維平面上...