2310 - 方阵填数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 125 MB

在一个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> 

题目输入

每个测试文件只包含一组测试数据,每组输入一个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

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;
}

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;
}

Python解答

# coding=utf-8
#!/usr/bin/python3


def solve(N):
    matrix = [[0 for i in range(0, N)] for i in range(0, N)]
    num = 1
    N_2 = int((N+1)/2)
    for i in range(0, N_2):
        x, y = i, N - i - 1
        matrix[x][y] = num
        while x < y:
            matrix[x][y] = num
            num += 1
            x += 1
        while y > i:
            matrix[x][y] = num
            num += 1
            y -= 1
        while x > i:
            matrix[x][y] = num
            num += 1
            x -= 1
        while y < N - i -1:
            matrix[x][y] = num
            num += 1
            y += 1
    return matrix


def print_ans(matrix):
    n = len(matrix)
    for i in range(0, n):
        for j in range(0, n):
            if j == 0 and n <= 3:
                print('{:2d}'.format(matrix[i][j]), sep='', end='')
            elif j == 0:
                print('{:d}'.format(matrix[i][j]), sep='', end='')
            elif n <= 3:
                print(' {:2d}'.format(matrix[i][j]), sep='', end='')
            else:
                print(' {:d}'.format(matrix[i][j]), sep='', end='')
        print('')


def main():
    s = input()
    N = int(s)
    print_ans(solve(N))


if __name__ == '__main__':
    main()