螺旋方阵使用C++的简单实现

2023-05-16

题目

所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式:

输入在一行中给出一个正整数N(<=30)。

输出格式:

输出N×N的螺旋方阵。每行N个数字,每个数字占3位。

输入样例:

5

输出样例: 

001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009

输入样例:

10

输出样例:

001 002 003 004 005 006 007 008 009 010
036 037 038 039 040 041 042 043 044 011
035 064 065 066 067 068 069 070 045 012
034 063 084 085 086 087 088 071 046 013
033 062 083 096 097 098 089 072 047 014
032 061 082 095 100 099 090 073 048 015
031 060 081 094 093 092 091 074 049 016
030 059 080 079 078 077 076 075 050 017
029 058 057 056 055 054 053 052 051 018
028 027 026 025 024 023 022 021 020 019

 


简单分析

以输入5为例子

001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009

第一圈开始,每一步四笔,也就是步长为4
第一步:(0,0)起点
001 002 003 004
第二步:(0,4)起点
001 002 003 004 005
                006
                007
                008
                
第三步:(4,4)起点
001 002 003 004 005
                006
                007
                008
    012 011 010 009
第四步:(4,0)起点
001 002 003 004 005
016             006
015             007
014             008
013 012 011 010 009
第一圈结束

第二圈开始,步长为2
第一步:(1,1)起点
001 002 003 004 005
016 017 018     006
015             007
014             008
013 012 011 010 009
第二步:(1,3)起点
001 002 003 004 005
016 017 018 019 006
015         020 007
014             008
013 012 011 010 009
第三步:(3,3)起点
001 002 003 004 005
016 017 018 019 006
015         020 007
014     022 021 008
013 012 011 010 009
第四步:(1,3)起点
001 002 003 004 005
016 017 018 019 006
015 024     020 007
014 023 022 021 008
013 012 011 010 009
第二圈结束

第三圈开始,步长为1
第一步:
001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009
第二步:
001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009
第三步:
001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009
第四步:
001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009
第三圈结束

 以6为例子

001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011

第一圈开始,每一步五笔,也就是步长为5
第一步:(0,0)起点
001 002 003 004 005
第二步:(0,5)起点
001 002 003 004 005 006
                                   007
                                   008
                                   009
                                   010
                       
                
第三步:(5,5)起点
001 002 003 004 005 006
                                   007
                                   008
                                   009
                                   010
       015 014 013 012 011
第四步:(5,0)起点
001 002 003 004 005 006
020                             007
019                             008
018                             009
017                             010
016 015 014 013 012 011
第一圈结束

第二圈开始,步长为3
第一步:(1,1)起点
001 002 003 004 005 006
020 021 022 023        007
019                             008
018                             009
017                             010
016 015 014 013 012 011
第二步:(1,4)起点
001 002 003 004 005 006
020 021 022 023 024 007
019                      025 008
018                      026 009
017                             010
016 015 014 013 012 011
第三步:(4,4)起点
001 002 003 004 005 006
020 021 022 023 024 007
019                      025 008
018                      026 009
017        029 028 027 010
016 015 014 013 012 011
第四步:(4,1)起点
001 002 003 004 005 006
020 021 022 023 024 007
019 032               025 008
018 031               026 009
017 030 029 028 027 010
016 015 014 013 012 011
第二圈结束

第三圈开始,步长为1
第一步:(2,2)起点
001 002 003 004 005 006
020 021 022 023 024 007
019 032 033        025 008
018 031               026 009
017 030 029 028 027 010
016 015 014 013 012 011
第二步:(2,3)起点
001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031               026 009
017 030 029 028 027 010
016 015 014 013 012 011
第三步:(3,3)起点
001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031        035 026 009
017 030 029 028 027 010
016 015 014 013 012 011
第四步:(3,2)起点
001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011
第三圈结束

从上面可以看到四步一个圈,那就只需要确定圈数,步长,起点即可

那现在可以大体把代码格式写出来了

int count = 1;//填空格时候计数的
int map[n][n];
memset(map, 0, sizeof(map));
int length;//步长
for (int cycle = 0; cycle < 圈数; cycle++) {
    length=确定这一圈的步长
    第一步→
    第二步↓
    第三步←
    第四步↑
}

确定圈数:

先看圈数5*5和6*6都是三圈,那么   圈数   就是

(n % 2 == 0 ? n : n + 1) / 2

确定步长:

从5*5中可以看到步长是4,2,1

4,2很好确定关系,减了2。2,1就不好确定关系了

先不管,再来看下6*6是什么情况

 从5*5中可以看到步长是5,3,1

这个就很好,都是减了2,那5*5最后一圈步长为1的就是特殊了

那么步长公式就是

n - 2 * cycle - 1

 这时候再回过头来看下刚刚的特殊情况这个步长是多少,

当cycle走到最后一圈的时候,即cycle=2(cycle取值是 第0圈,第1圈,第2圈)

5 - 2 * 2 - 1

 步长等于0,那按我们写的代码模板,就需要后面的四步一步都不执行,所以我们在第一步之前判断一下length就好了

int count = 1;//填空格时候计数的
int map[n][n];
memset(map, 0, sizeof(map));
int length;//步长
for (int cycle = 0; cycle < 圈数; cycle++) {
    length=确定这一圈的步长
    if (length == 0) {
        直接确定中间数字
        break;
    }
    第一步→
    第二步↓
    第三步←
    第四步↑
}

 确定起点:

每一圈一共四步,那一共有四个起点

以6*6为例

每次第一步的坐标分别为(0,0),(1,1),(2,2),注:(横,纵)

001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011

那坐标和圈数的关系,由此可以判断坐标为(cycle,cycle)

每次第二步的坐标分别为(0,5),(1,4),(2,3),注:(横,纵)

001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011

那坐标和圈数的关系,由此可以判断坐标为(cycle,n-1-cycle)

每次第三步的坐标分别为(5,5),(4,4),(3,3),注:(横,纵)

001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011

那坐标和圈数的关系,由此可以判断坐标为(n-1-cycle,n-1-cycle)

每次第四步的坐标分别为(0,5),(1,4),(2,3),注:(横,纵)

001 002 003 004 005 006
020 021 022 023 024 007
019 032 033 034 025 008
018 031 036 035 026 009
017 030 029 028 027 010
016 015 014 013 012 011

那坐标和圈数的关系,由此可以判断坐标为(cycle,n-1-cycle)


到此为止就可以把刚刚的代码模板补全了

    int count = 1;//填空格时候计数的
    int map[n][n];
    memset(map, 0, sizeof(map));
    int length;//步长
    for (int cycle = 0; cycle < (n % 2 == 0 ? n : n + 1) / 2; cycle++) {
        length = n - 2 * cycle - 1;
        if (length == 0) {
            map[n / 2][n / 2] = count++;
            //这种情况的话肯定就是奇数,n/2一定就是中间那个,小数直接扔掉了
            break;
        }
        for (int pos = cycle, cnt = 0; cnt < length; ++cnt) {
            map[cycle][pos++/*右移*/] = count++;
        }

        for (int pos = cycle, cnt = 0; cnt < length; ++cnt) {
            map[pos++/*下移*/][n - 1 - cycle] = count++;
        }

        for (int pos = n - 1 - cycle, cnt = 0; cnt < length; ++cnt) {
            map[n - 1 - cycle][pos--/*左移*/] = count++;
        }

        for (int pos = n - 1 - cycle, cnt = 0; cnt < length; ++cnt) {
            map[pos--/*上移*/][cycle] = count++;
        }
    }

之后就是打印整个数组了


 AC代码

#include <cstdio>
#include <cstring>
#include "iostream"
#include "memory"

using namespace std;

int main() {

    int n;
    cin >> n;

    int count = 1;//填空格时候计数的
    int map[n][n];
    memset(map, 0, sizeof(map));
    int length;//步长
    for (int cycle = 0; cycle < (n % 2 == 0 ? n : n + 1) / 2; cycle++) {
        length = n - 2 * cycle - 1;
        if (length == 0) {
            map[n / 2][n / 2] = count++;
            //这种情况的话肯定就是奇数,n/2一定就是中间那个,小数直接扔掉了
            break;
        }
        for (int pos = cycle, cnt = 0; cnt < length; ++cnt) {
            map[cycle][pos++/*右移*/] = count++;
        }

        for (int pos = cycle, cnt = 0; cnt < length; ++cnt) {
            map[pos++/*下移*/][n - 1 - cycle] = count++;
        }

        for (int pos = n - 1 - cycle, cnt = 0; cnt < length; ++cnt) {
            map[n - 1 - cycle][pos--/*左移*/] = count++;
        }

        for (int pos = n - 1 - cycle, cnt = 0; cnt < length; ++cnt) {
            map[pos--/*上移*/][cycle] = count++;
        }
    }

    for (int i = 0; i < n; i++) {
        if (i != 0) {
            cout << endl;
        }
        for (int j = 0; j < n; j++) {
            if (j != 0) {
                cout << ' ';
            }
            printf("%03d", map[i][j]);
        }
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

螺旋方阵使用C++的简单实现 的相关文章

随机推荐

  • cmake3.8.2安装

    下载 xff1a 官网下载https cmake org download xff0c 最新的为3 14版本 xff0c 下载完成如下图 xff1a 安装很简单 xff0c 一路next
  • C语言:二维数组的使用及水平制表符(tab)

    题目 xff1a 编写一个计算从0 10各个数的平方和立方的程序 xff0c 并使用水平制表符 xff08 tab xff09 打印下表 要点一 xff1a 二维数组的应用 int a 11 3 定义了一个11 3 xff0c 即11行3列
  • win+G没反应,Xbox game bar按不出来

    按照https www bilibili com read cv7305256 这个方法前三个方案都没得用 重新设置快捷键也没有用根本就不识别 win 43 g就是填不进去 xff0c 其它快捷键可以 xff0c 就算填进去了 xff0c
  • gta5如何快速吃零食,M键里面没有动作

    在M菜单的风格里面 xff0c 把动作改成吃零食 去商店买好零食 xff0c 然后按M在动作那里设置成吃零食 xff0c 之后直接按Caps Lock键就能吃了立马补血
  • gta5如何快速吃零食,M键里面没有动作

    在M菜单的风格里面 xff0c 把动作改成吃零食 去商店买好零食 xff0c 然后按M在动作那里设置成吃零食 xff0c 之后直接按Caps Lock键就能吃了立马补血
  • GTA5怎么快速吃零食 回血

    百度下载按键精灵 新建脚本 KeyDowns 34 M 34 1 Delay 30 KeyUps 34 M 34 1 Delay 30 KeyDowns 34 Down 34 1 Delay 30 KeyUps 34 Down 34 1 D
  • GTA5前置任务怎么使用差事传送

    首先说一下会出的问题 1 线上等级没有到30级是没有提高产量差事的 3 提高产量差事没有出现R星服务器错误直接进去差事的 xff0c 请把你的游戏语言改成简体中文 xff0c 其他语言卡不了 有部分人出现了错误也会出现差事 4 复仇者的任务
  • npm ERR! code ERR_INVALID_URL,npm err安装报错

    nodeenv PS E WebstormProjects node onebot 1 3 final 2 gt npm i npm ERR code ERR INVALID URL npm ERR Invalid URL npm ERR
  • 桌面alt+enter按不了,没反应

    关闭360桌面助手即可 xff0c 如果是其它问题按下面的方法排查 https blog csdn net m0 37787662 article details 104038720 https blog csdn net zw521cx
  • 打游戏csgo的时候莫名其妙卡一下

    经过长期观察发现如下情况 我是天选2 3060 也是csgo突然卡一下 xff0c 有时候声音也一起同时卡一下 xff0c 半秒的样子 这篇文章适用于开启了核显和独显的 xff0c 并且是核显直连 之前一直在找 xff0c 看了好多解决方案
  • csgo游戏中怎么显示现实中的时间

    csgo游戏中怎么显示现实中的时间 xbox game bar下载这个应用就好了 这个更好使 提供一个浏览器 xff0c 这样的话想显示什么都可以了 按F11全屏
  • 华硕笔记本全硬盘恢复原厂状态 实机操作,MYASUS IN WINRE恢复,ASUS RECOVERY恢复

    本教程的前提的在之前就备份了原厂的RECOVERY分区 xff0c RESTORE分区 xff0c MYASUS分区 如果这些分区都没有的话那就只能找同型号笔记本的朋友要一份了 xff0c 或者去售后 xff0c 告诉他这三个分区都要恢复
  • 炉石传说 ccf

    炉石传说 ccf 题我就不贴了 xff0c 花了大概一下午写 xff0c 虽然感觉这个题难度不是很大 xff0c 但是还是结果只有七十分 xff0c ccf显示运行错误 xff0c 这个提示应该是运行测试用例的时候出现了逻辑错误 感觉应该还
  • word中编号怎么转成普通的字,如何把WORD编号转为普通文本

    记录一下word如何去掉自动编号格式但保留原编号内容的方法 xff1a 1 调出word的 开发工具 选项 打开文件 gt 选项 gt 自定义功能区 gt 选中开发工具 gt 确定 xff0c 2 编写宏 依次点击 xff1a 开发工具 x
  • xbox游戏文件备份了,怎么才能不重新下载

    今天我也是试了很久才找到的办法 因为之前我重装过 xff0c 有一次直接在xbox上下载地平线5 xff0c 结果秒安装好 我想应该可以用复制出来的文件直接安装 今天来试一下 xff0c 不想重新下载了 才一百兆的宽带 其他游戏一样的操作
  • VescoFx - Provoker压缩VST插件

    这个插件找了我好久哇 出处 xff1a https musicmakers ru vst 1399 vescofx provoker vocal compressor plugin v10 kompressor html https 10p
  • LittleAlterBoy.dll VST插件

    谷歌了很久都没有找到破解版的 xff0c 最后在一个群里面 xff0c 一位好心的老哥分享给我了 我也分享出来 https yunling lanzout com ic3Tpyhz0cd
  • 如何判断dll是64位,还是32位

    感觉这个方法最好用 PE文件头里有个machine字段指定CPU类型 xff0c 如果是0x8664就是64位程序 xff0c 0x14c 表示Intel 386或后继处理器及其兼容处理器 可以用c32asm工具导入dll文件查看 这个是x
  • 输出字符菱形

    编程输入字符X xff0c 输出由字符X构成的以下样式的字符图形 输入样例 输出样例 输入样例 A 输出样例 A AAA AAAAA AAAAAAA AAAAA AAA A 突然想到一个比较方便的 最中间那一竖条先不看 xff0c 看左边空
  • 螺旋方阵使用C++的简单实现

    题目 所谓 螺旋方阵 xff0c 是指对任意给定的N xff0c 将1到N N的数字从左上角第1个格子开始 xff0c 按顺时针螺旋方向顺序填入N N的方阵里 本题要求构造这样的螺旋方阵 输入格式 xff1a 输入在一行中给出一个正整数N