洛谷 2239 螺旋矩陣

2022-03-04 10:07:22 字數 841 閱讀 4848

翻了翻題解,發現我的這個方法好像並沒有被寫過,也許是這個方法太菜了,但是還是可以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**:

#includeusing

namespace

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列...