游客 Signup | Login
中文 | En

2310 - 方阵填数

在一个N*N的方阵中,填入1,2,……N*N个数,并要求构成如下的格式:

例如:

N=5

13 14 15 16  1

12 23 24 17  2

11 22 25 18  3

10 21 20 19  4

 9  8  7  6  5


N=6

<span style="font-family:SimSun;">16 17 18 19 20 &nbsp;1</span> 

<span style="font-family:SimSun;">15 30 31 32 21 &nbsp;2</span> 

<span style="font-family:SimSun;">14 29 36 33 22 &nbsp;3</span> 

<span style="font-family:SimSun;">13 28 35 34 23 &nbsp;4</span> 

<span style="font-family:SimSun;">12 27 26 25 24 &nbsp;5</span> 

<span style="font-family:SimSun;">11 10 &nbsp;9 &nbsp;8 &nbsp;7 &nbsp;6</span> 

Input

每个测试文件只包含一组测试数据,每组输入一个N。

Output

输出构成的方阵。

Examples

Input

5

Output

13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5

Hint

6

-------------------------

16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6

Solution C

#include <stdio.h>

int main (void)
{
    int i, n, k, ix, iy;

    scanf("%d", &n);
    int A[n][n];

    k = 0;
    for(i = 0; i <= n / 2; i++)
    {
        for(ix = i, iy = n - i - 1; ix < n - i - 1; ix++)
        {
            k++;
            A[ix][iy] = k;
        }
        for(ix = n - i - 1, iy = n - i - 1; iy > i; iy--)
        {
            k++;
            A[ix][iy] = k;
        }
        for(ix = n - i - 1, iy = i; ix > i; ix--)
        {
            k++;
            A[ix][iy] = k;
        }
        for(ix = i, iy = i; iy < n - i - 1; iy++)
        {
            k++;
            A[ix][iy] = k;
        }
    }
    if(n % 2 == 1)    A[n / 2][n / 2] = ++k;
    for(ix = 0; ix < n; ix++)
    {
        for(iy = 0; iy < n; iy++)
        {
            if(iy > 0)    printf(" ");
            if(A[ix][iy] < 10&&(iy == 0||A[ix][iy - 1] < 10))    printf(" ");
            printf("%d", A[ix][iy]);
        }
        printf("\n");
    }

    return 0;
}

Solution C++

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int n;
int map[200][200]={0};
void fill_map(int t,int l,int s)
{
    for(int i=l+1;i<=s;i++)
        map[i][s]=t++;
    for(int i=s-1;i>=l+1;i--)
        map[s][i]=t++;
    for(int i=s-1;i>=l+1;i--)
        map[i][l+1]=t++;
    for(int i=l+2;i<=s-1;i++)
        map[l+1][i]=t++;
    if(s>=0) fill_map(t,l+1,s-1);
}
void print_map1()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<n;j++)
            printf("%2d ",map[i][j]);
        printf("%2d\n",map[i][n]);
    }
}
void print_map2()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<n;j++)
            printf("%d ",map[i][j]);
        printf("%d\n",map[i][n]);
    }
}
int main()
{
    cin>>n;
    fill_map(1,0,n);
    if(n!=10)
        print_map1();
    else
        print_map2();
    return 0;
}

Hint

6

-------------------------

16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6

Time Limit 1 second
Memory Limit 125 MB
Discuss Stats
上一题 下一题