翻了翻題解,發現我的這個方法好像並沒有被寫過,也許是這個方法太菜了,但是還是可以ac的。
首先呢:1 ≤ n ≤ 30,000.....暴力就別想了,最多50分
於是就開始在暴力的基礎上找方法,無意發現,如果我們開始先將矩陣一層一層的剝開,直到目標位置在新矩陣的最外層是停止。此時最壞情況,目標點在30000x30000矩陣的的(2,1)位置(如果搜尋方向不同可能會不一樣,但結論相同),我們也只需迴圈填120000-4個數就可以找到答案。
重要的是「剝開」矩陣的過程,先貼**:
int c=min(min(x-1,n-x),min(y-1,n-y));//確定要剝開的層數
while(c--)
另外我們也不必真正的將數字填上,用tot記錄好填到哪個數了,到時候輸出tot與前面算出ans的和即可。
而且由於我們已經保證目標點在新矩陣的最外層,所以不避開任何陣列進行記錄,填數時撞到邊界就轉向。
ac**:
#includeusingnamespace
std;
int n,x,y,tot=1,i=1,j=0
;long
long ans=0
;bool pd(int xx,int
yy)
return0;
}int
main()
while(tot<=n*n)
while(i+1
<=n)
while(j-1>=1)
while(i-1>=1)
}}
洛谷P2239 螺旋矩陣
題目鏈結 直接看題 一看就很數學 我們不妨來畫圖 畫出幾個矩陣,找他們的關係 然後發現 當i 1時,對應的值就是j所對應的值 當i n時,所對應的值就是3 n 2 j 1 當j 1時,所對應的值是4 n 2 i 當j n時,對應的值是n x 1。然後對於這個很多很多層的矩陣,我們可以對其進行剝層,每...
洛谷 P2239 螺旋矩陣 數學
乙個nn行nn列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第11行第11列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1,2,3,n1,2,3,n,便構成了乙個螺旋矩陣。2 下圖是乙個n 4n 4 時的螺...
Luogu P2239 螺旋矩陣
乙個n行n列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第1行第1列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1,2,3,n,便構成了乙個螺旋矩陣。現給出矩陣大小n以及i和j,請你求出該矩陣中第i行第j列...