[ユニバーサルタイトルの2014 NOIP第三のセット]ヘリックスマトリックスは

行列## ##スパイラル

タイトルは、説明
の方法によって生成された螺旋状のn行n列の行列。

フロントグリッドを通過することはない場合に移動その後、または右折;左上隅(行1、列1)マトリックスから出発して、最初に右に移動し、上述した動作は、マトリックスを介して全ての格子まで繰り返されます。配列は、それらが螺旋状マトリックスを構成する、順次グリッド1内に充填され、通過する2、3、...、N。

図は、スパイラル行列N = 4です。

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

今、行列サイズNとiとjを考えると、あなたは私と列jは行列の行の番号を見つけます。

入力フォーマット:
入力コモン線、三つの整数N、I、Jを含むが、それぞれのスペースで区切られた各二つの整数、マトリクスのサイズ、間、行番号を求めることと列番号が配置されています。

出力形式:
出力コモンラインは、それぞれの行列の行i及び列jの数を表す整数を含んでいます。

サンプル入力
423
出力サンプル
14
[データ記述]
データの50%、100≤1≤nについて、
iは、データの100%、1≤N≤30,000,1≤に N≤、1≤Jさ≤N。

実際には、非常に簡単です、この質問、たとえば、あなたはわずか数スパイラル行列を果たし、その後、あなたはルールを見つけることができます:
1 2 3
8 9 4
5 6 7

我々は、次に、N = N = 5マトリックスに埋め込まれた3マトリックス:
1 2 3 4 5
16 1 2 3 6
15 8 9 4 7
14 7 6 5 8
13 12である11 10 9。
比較中間体Nオリジナル= 5行列に:
17 19 18
24-25 26
23 22 21
私の神、あなたは(私たちはKを呼んで)実際には、これは、N = 3の行列各カウントプラス16であることがわかりました!
偶然の一致?あなたはそれを信じて、その後、比較マトリックスのために、N 2 = N = 4をプレイすることはできません、あなたは、K = N * 4-4を見つける
あなたはまた、正則行列の外に見つけることができます取得するには、マトリックス内:

X == 1またはy == nが、結果はX + Y-1である場合
、X == nは1またはy ==が、結果は4 * NXY-1

私はDPで始めたいと思ったが、データは再帰を使用せざるを得ない.....の下で許可されていません。
コード付き:

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int turn(int n,int x,int y)
{
    if(x==1||y==n)return x+y-1;
    else if(x==n||y==1)return 4*n-x-y-1;
    else
    {
        return turn(n-2,x-1,y-1)+n*4-4;//每次就是n-2的矩阵+k
    }
}
int main()
{
    int n,x,y;
    scanf("%d%d%d",&n,&x,&y);
    printf("%d",turn(n,x,y)); 
    return 0;
}

おすすめ

転載: www.cnblogs.com/candy067/p/11402009.html