NOIP2014 普及組 螺旋矩陣

2021-09-07 14:18:20 字數 1905 閱讀 4679

一、題目

【noip2014 普及組】螺旋矩陣

時間限制: 1 sec  記憶體限制: 128 mb

提交: 18  解決: 0

[提交][狀態][討論版]

題目描述

乙個n行n列的螺旋矩陣可由如下方法生成:

從矩陣的左上角(第1行第1列)出發,初始時向右移動;如果前方是未曾經過的格仔,則繼續前進,否則右轉;重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1, 2, 3, ... , n,便構成了乙個螺旋矩陣。2

下圖是乙個n = 4 時的螺旋矩陣。

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

現給出矩陣大小n以及i和j,請你求出該矩陣中第i行第j列的數是多少。

輸入輸入共一行,包含三個整數 n,i,j,每兩個整數之間用乙個空格隔開,分別表示矩陣大小、待求的數所在的行號和列號。

輸出輸出共一行,包含乙個整數,表示相應矩陣中第i行第j列的數。

樣例輸入

4 2 3

樣例輸出14

提示【資料說明】 

對於50%的資料,1 ≤ n ≤ 100;

對於100%的資料,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。 

二、分析及**

【題解】

首先,本題有兩種思路。

1.老老實實填陣列。(此方法簡單易懂,但當矩陣過大時,就會出現陣列開不夠大,或long long也不夠的情況)

2. 用演算法找規律,但規律不是一般的難找。我就簡單說說我找到的規律。 1

23412

1314511

1615610

987

1243

首先對比兩表,你就會發現下表就是上表中間四格每個減去12,正好就是外圈12個數中最大的;

而12就是外圈邊長的4倍減4;

於是,就成了這樣12

34121

25113

46109

87紅色是內圈,黑色是外圈

紅色基數為12,黑色基數為0

同時,每一圈最上方的一行就是i+j-1的值。

最右方的一列就是i+j-1的值。

最下方的一行就是4n-i-j-1的值。

最左方的一列就是4n-i-j-1的值。

(一定要記得加上外圈基數哦!)

dp思路

狀態:用f[n][i][j]表示n階方塊i,j位置的值。

對於外圈的:

i表示列,j表示行

if(i>=j)

f[n][i][j]= i+j-1

if(if[n][i][j]= 4n-i-j-1

對於內圈:

f[n][i][j]= f[n-2][i-1][j-1]+n*n-(n-2)*(n-2);

初始狀態:

f[1][1][1]=1

f[2][1][1]=1

f[2][2][1]=2

f[2][2][2]=3

f[2][1][2]=4

外圈表示:

if(j==1||i==1||j==n||i==n)

內圈表示:

i>1&&i1&&j**

1 #include 2

using

namespace

std;

3int i=2,j=3,n=3;4

void luo(int

n1)5

11if (i>=j) printf ("

%d",a+i+j-2*n1+1

);12

else printf ("

%d",a+(n-2*n1+1)*4-i-j+n1+n1+1

);13}14

intmain()

15

普及 NOIP 2014 螺旋矩陣

題目描述 乙個n行n列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第1行第1列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1,2,3,n,便構成了乙個螺旋矩陣。2 下圖是乙個n 4 時的螺旋矩陣。1 2 3...

NOIP2014普及組 子矩陣

給出如下定義 1.子矩陣 從乙個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣 保持行與列的相對順序 被稱為原矩陣的乙個子矩陣。例如,下面左圖中選取第 2 4 行和第 2 4 5 列交叉位置的元素得到乙個 2 x 3 的子矩陣如右圖所示。93 3399 4874 1746 6685 6974 56...

NOIP 2014 螺旋矩陣

洛谷傳送門 jdoj傳送門 乙個 n行 n列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第 1行第 1列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入 1,2,3,n2,便構成了乙個螺旋矩陣。下圖是乙個 n ...