首页 > 其他分享 >洛谷 P5731 蛇形方阵

洛谷 P5731 蛇形方阵

时间:2024-08-19 17:37:13浏览次数:9  
标签:CODE 下标 P5731 int 样例 read 蛇形 洛谷

目录

题目 - 蛇形方阵

题目描述

给出一个不大于 9 的正整数 n,输出 n × n 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。

输入格式

输入一个正整数 n,含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

样例

样例输入 #1

4

样例输出 #1

  1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

提示

数据保证,1 ≤ n ≤ 9。

AC CODE

思路

  • 数据的增长方向一共有 4 个,左上 → 右上,右上 → 右下,右下 → 左下,左下 → 左上

  • 设置一个标志位 flag_run 来确定当前的数据增长方向,每切换一次增长方向,使标志位自增一次

  • 得到数学关系:flag_run / 4 得到的值为 当前下标在矩阵由外到内的第几轮

    一个完整 左上 → 右上,右上 → 右下,右下 → 左下,左下 → 左上 过程为一轮

  • 得到数学关系:flag_run % 4 得到的值分别对应以上四个方向

  • 设置两个下标位【read_x,read_y】来标记当前的数组下标
    则四个方向对应的下标变化为 y++,x++,y--,x--

AC CODE

#include <iostream>

using namespace std;

int main()
{
    int n;	// 矩阵大小输入
    cin >> n;

    int ans_arr[10][10];	// 结果数组
    int read_x = 1, read_y = 1; // 标记数组下标
    int flag_run = 1;   // 标记增长方向
    int num = 1;    // 待填入的数据

    while (num <= (n * n))	// 当数据还没填完(数据最大为n*n)
    {
        ans_arr[read_x][read_y] = num;	// 将数据填入数组

        int temp = flag_run % 4;	// 获得当前数据增长的方向
        if (temp == 1)	// 左上 → 右上
        {
            read_y++;	// 列坐标++
            if (read_y == (n - (flag_run / 4)))	// 增长到这一轮的最后一列
            {
                flag_run++;	// 改变增长方向
            }
        }
        else if (temp == 2)	// 右上 → 右下
        {
            read_x++;	// 行坐标++
            if (read_x == (n - (flag_run / 4)))	// 增长到这一轮的最后一行
            {
                flag_run++;	// 改变增长方向
            }
        }
        else if (temp == 3)	// 右下 → 左下
        {
            read_y--;	// 列坐标--
            if (read_y == (1 + (flag_run / 4)))	// 减小到这一轮的第一列
            {
                flag_run++;	// 改变增长方向
            }
        }
        else	// 左下 → 左上
        {
            read_x--;	// 行坐标--
            if (read_x == (1 + (flag_run / 4)))	// 减小到这一轮的第一行
            {
                flag_run++;	// 改变增长方向
            }
        }

        num++;	// 待填入数据自增
    }

    for (int h = 1; h <= n; h++)	// 输出处理
    {
        for (int i = 1; i <= n; i++)
        {
            printf("%3d", ans_arr[h][i]);
        }
        cout << endl;
    }

    return 0;
}

标签:CODE,下标,P5731,int,样例,read,蛇形,洛谷
From: https://www.cnblogs.com/Muhuai/p/18367792

相关文章

  • 洛谷 P1540 [NOIP2010 提高组] 机器翻译
    题目概括给定N个整数,和一个容量为M的“字典”,从头到尾依次翻译,每次翻译先看自家字典,没有的话再看别人的字典并存到自家字典,如果自家字典满了,当前单词的翻译会代替最早进入的。做题思路定义一个长度为M的字典数组,依次遍历N个数,每次翻译先检索字典数组,没有的话加入字典并......
  • 洛谷 P5461 赦免战俘
    赦免战俘题目背景借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!题目描述现有2n×2......
  • 洛谷 P3919 可持久化线段树 1 之主席树模板(初级)
    洛谷P3919题解传送锚点摸鱼环节【模板】可持久化线段树1(可持久化数组)题目背景UPDATE:最后一个点时间空间已经放大2021.9.18增添一组hack数据by@panyf标题即题意有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集)题目描述如题,你需要维护这......
  • 洛谷P1020 [NOIP1999 提高组] 导弹拦截(未完)
    传送门:P1020[NOIP1999提高组]导弹拦截题目大意:一个拦截导弹的系统,每次只能拦截高度不超过上一个的导弹求出:一个系统最多能拦截的导弹数量;要拦截所有导弹最少需要的该系统的数量。思路:第一问:一眼就是最长单调不上升子序列,朴素DP求解,复杂度为O(n^2);请参考,能过掉50%......
  • 洛谷P1983 [NOIP2013 普及组] 车站分级 题解
    思路由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点。因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案。实现因为可能出现重边,而且\(n\le1000\),所以在处理车次连边的时候使用邻接矩阵,再改成邻......
  • 洛谷P1083 [NOIP2012 提高组] 借教室 && 差分学习笔记
    传送门:P1083[NOIP2012提高组]借教室"八骏日行三万里,穆王何事不重来。"可惜啊,他再也没有回来……题目大意:给你每天能够租借的教室数量和几份租借申请每份申请包含租界时间(从第几天到第几天)和每天需要租借的教室数量问你能否满足所有的租借要求,如果不能,驳回一份最前......
  • 洛谷P1001题解
    洛谷P1001题解友情提示:“题目传送门”被贴在了题目编号上,请自行点击查看!主要知识点C/C++语言框架基本数据类型的定义与使用cin/cout或scanf()/prinf()的使用代码一小步,OI一大步(bushi)AC代码#include<bits/stdc++.h>typedeflonglongll; //“十年OI一场空,不开long......
  • 线段树模板,洛谷原题P3373
    线段树区间乘、加,范围求和,QWQ原题#include<bits/stdc++.h>#definePIIpair<int,int>#defineintlonglong#defineDBdoublenamespaceFastIO{ inlineintread(intMOD,int&ret){ charch=getchar();intngtv=1; if(MOD==0){while(ch<&#......
  • 洛谷P1536 村村通
    传送门:P1536村村通人间风起,四季同书。(还是一篇817的做题记录la~)题意:有好多组数据,每组数据给你m条无向边的信息(u,v);问你最少再添加多少条边就能使整张图连通。思路:首先我们要知道,一个图如果连通,边的数量最少是n-1;但是题目会出现这样一种情况:n=4,m=3;1<——>......
  • 洛谷 B3735 B3736 B3787 题解
    嘿嘿我发烧已经好了!题目目录:No.1 B3735[信息与未来2018]圣诞树No.2 B3736[信息与未来2018]最大公约数No.3 B3787[信息与未来2023]精密计时 OK,开始正文!第一题:B3735[信息与未来2018]圣诞树 题目描述圣诞树共有 nn 层,从上向下数第 11 层有 11 个......