算法学习系列(十六):二维数组填充数字问题

目录

  • 引言
  • 一、思路
  • 二、代码模板
  • 三、例题总结
    • 1.回字蛇形矩阵
    • 2.三角填充
    • 3.回文填充二

引言

关于这个二维数组填数问题我碰到过很多次,不管是找工作笔试面试,还是在算法竞赛,而且这种问题都有很多种变形,当初学算法的时候让我很是头疼,因为总是会了一道后,过了一段时间就忘了,又或者是这道会了,然后变了一下就不会了,我很是苦恼啊,不过当我某天在qq群中看到一个群友发的这种问题后,一下勾起了我的思考,然后不知道怎的,我就自己想出了一种方法,我觉得这个方法可以用在这种问题的任意一个地方,所以我觉得很好,然后我也就写篇博客总结一下吧,这个套路我是从BFS上汲取出来的,话不多说直接开始。

一、思路

我总结这些题的总体都是按照一定的方向循环填数的,然后就按照一个方向不断地前进,只要碰到了边界或者下一个位置已经被填充过了那就换一个方向继续走继续填充,直到达到cnt的大小

二、代码模板

int cnt = 1;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};int x = 0, y = 0;
matrix[x][y] = cnt++;  // matrix初始都置为0
while(cnt <= N)
{for(int i = 0; i < 4; ++i){while(1){int nx = x + dir[i][0];int ny = y + dir[i][1];if(x < 0 || x >= n || y < 0 || y >= n) break;  // 碰到边界if(matrix[x][y]) break;  // 已经填充过了x = nx, y = ny;matrix[x][y] = cnt++;}}
}

三、例题总结

1.回字蛇形矩阵

输入两个整数 n 和 m,输出一个 n 行 m 列的矩阵,将数字 1 到 n×m 按照回字蛇形填充至矩阵中。具体矩阵形式可参考样例。输入格式
输入共一行,包含两个整数 n 和 m。输出格式
输出满足要求的矩阵。
矩阵占 n 行,每行包含 m 个空格隔开的整数。数据范围
1≤n,m≤100输入样例:
3 3输出样例:
1 2 3
8 9 4
7 6 5
#include <cstdio>
#include <iostream>using namespace std;int dir[4][2] = {0,1,1,0,0,-1,-1,0};
const int N = 110;
int a[N][N];
int n, m, cnt = 1;int main()
{scanf("%d%d", &n, &m);int x = 0, y = 0;a[x][y] = cnt++;while(cnt <= n * m){for(int i = 0; i < 4; ++i){while(1){int nx = x + dir[i][0];int ny = y + dir[i][1];if(nx < 0 || nx >= n || ny < 0 || ny >= m) break;if(a[nx][ny]) break;x = nx, y = ny;a[x][y] = cnt++;}}}for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){printf("%d ", a[i][j]);}puts("");}return 0;
}

可以看出是全部正确的
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.三角填充

这个是一种斜线的走,只要把方向变一下,就行了,然后其余的这种都是一样的,只不过是方向的不同而已,其他的都是一样的

方阵的主对角线之上称为“上三角”。请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。例如:当n=3时,输出:
1 2 3
6 4
5当n=4时,输出:
1 2 3 4
9 10 5
8 6
7当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
#include <cstdio>
#include <iostream>using namespace std;const int N = 25;
int a[N][N];
int n, cnt = 1;int dir[3][2] = {0,1,1,-1,-1,0};  // 右 左下 上int main()
{scanf("%d", &n);int x = 0, y = 0;a[x][y] = cnt++;while(cnt <= (n+1) * n / 2){for(int i = 0; i < 3; ++i){while(1){int nx = x + dir[i][0];int ny = y + dir[i][1];if(nx < 0 || nx >= n || nx < 0 || ny >= n) break;if(a[nx][ny]) break;x = nx, y = ny;a[x][y] = cnt++;}}}for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(a[i][j]) printf("%4d",a[i][j]);}puts("");}return 0;
}

可以看出都是正确的
在这里插入图片描述

在这里插入图片描述

3.回文填充二

题目描述
给定两个数字 n 和 m,代表矩阵的大小。现有一个二维数组,需要对其进行填充。填充规律如下图:

在这里插入图片描述
在这里插入图片描述

输入描述
输入只有一行,第一个数字是 n,第二个数字是 m.输出描述
请输出整个二维数组。每行末尾的数字后没有空格。输入示例
3 4
输出示例12 11 10 9
3 2 1 8
4 5 6 7数据范围:
1 <= n <= 100;
1 <= m <= 100;
n 和 m 可能相等,也有可能不相等。

这个有点讨厌是从里到外一层一层填,我最初是按模板写的,发现不对,因为他是一层一层往外走的,不是走到边界或者碰到填过了的,就跟下图一样,这就麻烦得很,因为我不知道每一层的边界是多少,然后我就点开讨论区,看见了从外到内这四个字,一下就明白了,就从外向内跟那个回型填充一样,只不过cnt是从n*m开始了,见代码
在这里插入图片描述

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;const int N = 110;
int matrix[N][N];
int n, m;
int dir[4][2] = {0,1, 1,0, 0,-1, -1,0};  // 分别为右 下 左 上
int cnt;int main()
{scanf("%d%d", &n, &m);int x = 0, y = 0;cnt = n * m;matrix[x][y] = cnt--;while(cnt > 0){for(int i = 0; i < 4; ++i){while(1){int nx = x + dir[i][0];int ny = y + dir[i][1];if(nx < 0 || nx >= n || ny < 0 || ny >= m) break;if(matrix[nx][ny]) break;x = nx, y = ny;matrix[x][y] = cnt--;}}}for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){printf("%d ", matrix[i][j]);}puts("");}return 0;
}

可以看出样例是正确的,然后也AC了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307664.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析 | 什么是超融合数据中心网络?

数据中心网络连接数据中心内部通用计算、存储和高性能计算资源&#xff0c;服务器间的所有数据交互都要经由网络转发。当前&#xff0c;IT架构、计算和存储技术都在发生重大变革&#xff0c;驱动数据中心网络从原来的多张网络独立部署向全以太化演进。而传统的以太网无法满足存…

Linux磁盘阵列

一.RAID磁盘阵列介绍 RAID&#xff08;Redundatnt Array of lndependent Disks&#xff09;&#xff0c;全称为&#xff1a;独立冗余磁盘阵列 解释&#xff1a; RAID是一种把多块独立的硬盘&#xff08;物理硬盘&#xff09;按不同的方式组合起来形成一个硬盘组&#xff08;逻…

【Linux】深挖进程地址空间

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉【Linux】进程地址空间 > 毒鸡汤&#xff…

vue连接本地服务器

vue 连接本地服务器做后端。 后端服务 使用springboot新建一个基于restful的接口&#xff0c;访问如下的地址&#xff0c;返回值。 vue构建 新建一个vue项目&#xff0c;安装访问服务器的插件。 npm install axios vue-axios --save 修改main.js使用axios&#xff0c;最终…

面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金&#xff0c;以后去中小厂毫无压力&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大厂出来…

svg学习

概念 svg 可缩放矢量图形 svg 使用xml格式定义图像 svg 形状 矩形 <rect> <?xml version"1.0" standalone"no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&q…

【事故总结】Mybatis-Wrapper导致的生产事故

近期遭遇了一次生产环境的严重告警&#xff0c;涉及慢接口和CPU过载。经过排查&#xff0c;发现问题根源在于一段使用MyBatis的查询代码。当传入空列表作为查询条件时&#xff0c;MyBatis会忽略该条件&#xff0c;导致全表扫描&#xff0c;进而引发系统资源耗尽和频繁的Full GC…

《别让猴子跳回背上》——管理者的时间管理

讲时间管理的书很多&#xff0c;但这本是专门讲给管理者的时间管理。 在职场中&#xff0c;许多管理者都会碰到工作计划执行不下去、组织目标难于实现的问题&#xff0c;搭进了自己所有可以支配的时间&#xff0c;仍旧是焦头烂额&#xff0c;顾此失彼&#xff1b;而下属则因为…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

LabVIEW各版本安装指南

链接地址如下&#xff1a; https://pan.baidu.com/s/1NF9hY03bApwwpI-WVHGlZg?pwd0531 1.鼠标右击【LabVIEW2023】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 LabVIEW2023】。 2.打开解压后的文件夹&#xff0c;双击打开【Setup】文件…

C语言 volatile关键字

volatile关键字介绍 volatile 是一个关键字&#xff0c;用于修饰变量&#xff0c;表示该变量是易变的&#xff0c;即可能在任何时候被意外地改变。在多线程编程中&#xff0c;当多个线程同时访问同一个变量时&#xff0c;由于线程之间的交互和优化&#xff0c;可能会导致变量的…

【挑战全网最易懂】深度强化学习 --- 零基础指南

深度强化学习介绍、概念 强化学习介绍离散场景&#xff0c;使用行为价值方法连续场景&#xff0c;使用概率分布方法实时反馈连续场景&#xff1a;使用概率分布 行为价值方法 强化学习六要素设计奖励函数设计评论家策略学习与优化 算法路径深度 Q 网络 DQN演员-评论家算法&…