題意:
宇宙射線會在無限的二維平面上傳播(可以看做乙個二維網格圖),初始方向預設向上。宇宙射線會在發射出一段距離後**,向該方向的左右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,甚至有全國第一的水平 但最可怕的是,它可以發出宇宙射線 宇宙射線可以摧毀人的智商,進行降智打擊 宇宙射線會在無限的二維平面上...