我註冊了一些在線代碼競賽,其中一個問題是在某個k輪迴之後,您計算了某個'棋盤'的x,y範圍內某個點的位置。通過一個while循環和4個條件語句做K次迭代,我能夠解決這個問題,並且它在一定程度上起作用。我總是會在他們的一個「隱藏測試」上遇到時間限制。什麼數學理論被用來解決這個問題?
讓我來回答這個問題,我正在瀏覽其他人的代碼,並注意到這個很酷的預測算法的工作,而不是O(k * n),但基本上是O(2 * n)(n =語句循環,k =步數)。有人可以解釋他使用的是什麼數學理論嗎?
解決方案通過EDGAR_G6:
int[] chessBishopDream(int[] s, int[] xy, int[] dir, int k) {
int k1;
for (int i = 0; i< 2; i++) {
if (dir[i] > 0)
k1 = k - 2*s[i] + xy[i];
else
k1 = k - (xy[i] + 1);
k1 = k1 % (2*s[i]);
xy[i] = k1 % s[i];
System.out.println(xy[i]);
System.out.println(k1);
if (k1 >= s[i])
xy[i] = k1 - 2 * xy[i] - 1;
xy[i] %= s[i];
}
return xy;
}
這裏有一個問題:question on code fights
謝謝!
這裏是直接從上面的鏈接問題:
在ChessLand有一個反覆出現的夢境一個小而驕傲棋主教。在夢中,主教發現自己身處一個n×m棋盤上,每個棋盤上都有鏡子,並不是主教,而是一束光。這條光線只沿對角線移動(主教不能想象任何其他類型的移動,即使在它的夢中),它永不停止,一旦它到達棋盤邊緣或角落,它就會反射並繼續前進。
給定光線的初始位置和方向,在k個步驟之後找到它的位置,其中步驟意味着從一個單元移動到相鄰單元或從板的角落反射。
例
For boardSize = [3, 7], initPosition = [1, 2],
initDirection = [-1, 1] and k = 13, the output should be
chessBishopDream(boardSize, initPosition, initDirection, k) = [0, 1].
這裏是主教的路徑:
[1, 2] -> [0, 3] -(reflection from the top edge)-> [0, 4] ->
[1, 5] -> [2, 6] -(reflection from the bottom right corner)-> [2, 6] ->
[1, 5] -> [0, 4] -(reflection from the top edge)-> [0, 3] ->
[1, 2] -> [2, 1] -(reflection from the bottom edge)-> [2, 0] -(reflection from the left edge)->
[1, 0] -> [0, 1]
描述問題! – vz0
我編輯了問題 – thecoolestname36
圖片有助於理解。 – vz0