一些自己 Bellcode Online Judge 的刷题思路

February 2, 2021 · C++ · 835次阅读

前言

本人的能力算不上好,难免会有纰漏与错误,还望dalao指正

391.回型方阵

题目描述

一个 n 行 n 列的螺旋方阵按如下方法生成:从方阵的左上角(第 1 行第 1 列)出发,初始时向下移动;如果前方是未曾经过的格子,则继续前进;否则,左转。重复上述操作直至经过方阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,…,n,便构成了一个螺旋方阵。下面是一个 n=4 的螺旋方阵。
编程输入一个正整数 n,生成一个 n×n 的螺旋方阵。

输入格式

一行一个正整数 n,1≤n≤20。

输出格式

共 n 行,每行 n 个正整数,每个正整数占 5 列。

样例数据

input

5

output

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

数据规模与约定

时间限制:1s
空间限制:64MB

实现代码

#include <iostream>
#define MAX 21
using namespace std;
int main() {
    ios::sync_with_stdio( false );
    int n, cnt, sum = 1;
    int arr[ MAX ][ MAX ] = { 0 };
    cin >> n;
    cnt = n / 2; //需要循环 n/2+1 次
    for ( int i = 0; i <= cnt; i++ ) {
        //这道题需要从竖开始遍历,一定要梳理好关系
        for ( int j = i; j < n - i; j++ ) { //先从左边的一竖遍历
            arr[ j ][ i ] = sum++;
        }
        for ( int j = i + 1; j < n - i; j++ ) { //遍历底部一横
            arr[ n - i - 1 ][ j ] = sum++;
        }
        for ( int j = n - i - 2; j >= i; j-- ) { //遍历右边一竖
            arr[ j ][ n - i - 1 ] = sum++;
        }
        for ( int j = n - i - 2; j > i; j-- ) { //遍历顶部一横
            arr[ i ][ j ] = sum++;
        }
    }
    for ( int i = 0; i < n; i++ ) {
        for ( int j = 0; j < n; j++ ) {
            cout.width( 5 );
            cout << arr[ i ][ j ];
        }
        cout << endl;
    }
    return 0;
}

喝杯水

刷题

最后编辑于9个月前

添加新评论