1、盲听C哈说
今天继续带大家刷一刷关于二维数组知识点的题目,二维数组这一块内容确实会难倒很多小朋友,在使用二维数组的时候,一定是先对循环嵌套要有一个较深的理解,否则在二维数组行和列的处理上就会显得有些笨拙(查缺补漏,不会什么就补什么!)。
2、问题描述
(1)题目描述
有数列:1,2,3,2,3,4,3,4,5,4,5,6,5,……。现在需要按照这个规律生成一个二维的数列,以如下表格为例:
1 | 2 | 3 | 2 | 3 | 4 | 3 | 4 | 5 | 4 |
2 | 3 | 2 | 3 | 4 | 3 | 4 | 5 | 4 | 5 |
3 | 2 | 3 | 4 | 3 | 4 | 5 | 4 | 5 | 6 |
2 | 3 | 4 | 3 | 4 | 5 | 4 | 5 | 6 | 5 |
3 | 4 | 3 | 4 | 5 | 4 | 5 | 6 | 5 | 6 |
4 | 3 | 4 | 5 | 4 | 5 | 6 | 5 | 6 | 7 |
3 | 4 | 5 | 4 | 5 | 6 | 5 | 6 | 7 | 6 |
4 | 5 | 4 | 5 | 6 | 5 | 6 | 7 | 6 | 7 |
5 | 4 | 5 | 6 | 5 | 6 | 7 | 6 | 7 | 8 |
4 | 5 | 6 | 5 | 6 | 7 | 6 | 7 | 8 | 7 |
输入一个正整数n和m,(n,m <= 20),输出按上述规律生成的二维数组中 第n行、第m列上的整数(行号和列号均从1开始计起)
(2)输入描述
输入占一行,为两个正整数n和m。
(3)输出描述
输出占一行,为第n行、第m列上的整数。
(4)样例输入1
3 7
(5)样例输出1
5
(6)样例输入1
10 10
(7)样例输出1
7
3、问题分析
这道题还是需要大家找规律的,看起来题目不长,但是能做出来的小朋友寥寥无几,其实做题有三大步骤,第一:阅读题目,搞清楚题目要求什么(考察语文阅读能力),第二:找到数学解题方法(数学思维逻辑能力),第三:写代码(代码编程能力),这三个缺一不可,任何一道题肯定是经历了这三个步骤的,没有谁一上来就开始写代码,除非这道题你曾经背诵过代码,但那样做似乎没有必要。
在这里约定第0行第0列不用【根据个人编码习惯,决定是否使用】,观察一下,发现每一行行首的数字和第一行的数字是对应的,我们先来观察第一行数字:1 2 3 2 3 4 3 4 5 4 5 6 ……,我们可以对其进行分组,第1组:1 2 3、第2组:2 3 4、第3组:3 4 5、第4组:4 5 6…… ,每一组开头的第一个数,都表明当前是第几个组,每一组有3个数字,假设s代表第几组,t代表每组中的第一个数(t的取值范围是1~3,要么当前是第1个数、要么是第2个数、要么是第3个数),进一步地,如果要求解每行的行首数据,那么需要知道当前所在行所代表的数字在第一行中是第几组第几列,例如要求解第5行的行首数据,它是第一行数据中的第2组的第2个数字,表示为公式就是在第5/3+1组,第5%3列,于是可以求出行首数据为:(5/3+1)+(5%3)-1等于3,因此第5行行首数据为3。因此,可以得出一个结论,第i行行首的数字为s+t-1(s代表是第几组,t代表是组内的第几个数字),有了每一行的起始数据之后,就可以根据数列的规律生成这一行所有的数据了。
本题的解题思路为:当算出每一行的行首数字之后(假设是第s组的第t个数),那么就可以计算当前行上的其它数据,因此需要两重循环,外重循环代表行,内层循环代表列,t在计数的时候,每次递增1,当t>3,那么就需要重新从t=1开始递增,且第s组,要变为第s+1组,即s=s+1,然后根据s和t的值,我们能够计算每个位置上的数字是s+t-1,因为本题数据量比较少,最多20行20列,因此我们可以一口气将其全部计算出来,最后输入m和n的值,输出a[m][n]即可,a是一个二维数组,里面存储了所有计算出来的数据。
唉,反正不知道你能不能听懂我在说什么,如果你还是不太理解,你找我拿视频吧,我有做关于这道题的图画+视频的详细解释。
4、代码实现
#include<bits/stdc++.h>
using namespace std;int main()
{int n,m,s,t;int a[25][25]={0};for(int i=1;i<=20;i++){// if-else 用来判断当前行的第一列数据// 在第一行的第几组,第几个,通过第s组和第t个// 就可以计算出当前行的行首数据,即s+t-1 if(i%3==0)s=i/3,t=3;else s=i/3+1,t=i%3;// 计算第i行的行首数字,由这个数据出发,规律填数 a[i][1] = s+t-1;// 从第2列开始填数,填到第20列 for(int j=2;j<=20;j++){t++;if(t>3)s++,t=1;a[i][j] = s+t-1;}}cin >> n >> m;cout << a[n][m];return 0;
}
5、OJ测试
大家写完代码之后如果想要做OJ测试,可以找我要相关链接,电脑自动评测会更加准确~,好了,今天这篇文章就讲到这里,我们下期再见~