今天在做蓝桥杯的真题练系的时候发现了一个有意思的题目,蛇形填数题,题目如下
标准的解法应该是分别对奇数和偶数的行和列做不同的操作,对内部的数据也以右上,左下两个方向分开看待(行数+列数=奇数时是左下方向,行数+列数=偶数时是右上方向)。代码如下
import java.util.*;
public class Main {
public static void main(String[] args)//此处的r代表行,c代表列
{
int r = 1 , c = 1 , num = 1;//第一行第一列
while(r != 20 || c != 20){//我们要求的是第二十行第二十列所填的数
if(r == 1){//行等于1的时候开始看列
if(c % 2 == 1) c ++ ;//如果是奇数列,则直接水平向右移动
else {
r ++ ; c --;//如果是偶数列,则向左下移动
}
}
else if(c == 1){//列等于1的时候看行
if(r % 2 == 0) r ++;//如果是偶数行,则直接向下移动
else {
r -- ; c ++ ;//如果是奇数行则直接向右上移动
}
}
else if((r + c) % 2 == 1) {//来看中间的数据内容,如果行数加列数是奇数
r ++ ; c -- ;//向左下方向移动
}
else {//如果行数+列数是偶数,
r -- ; c ++ ;//向右上方向移动
}
num ++ ;//取值
}
System.out.println(num);//输出第二十行第二十列所填的数字
}
}
运行结果如图:
其实也是一种很巧妙地解法,但是我还是觉得有一些繁琐,所以就往后面又填了两行
1 | 2 | 6 | 7 | 15 |
3 | 5 | 8 | 14 | 17 |
4 | 9 | 13 | 12 | 26 |
10 | 12 | 19 | 25 | 42 |
11 | 20 | 24 | 33 | 41 |
我们就可以注意到,从表中的1-表中的41是一条斜线,而这条斜线上的所有数字刚好就代表着第n行第n列所填进去的数字,而对这些数字进行观察我们可以发现一些巧妙的规律
第一行第一列:1
第二行第二列:5
第三行第三列:13
第四行第四列:32
第五行第五列:41
或许这样看还看不出什么,那要是我们换个写法呢?
第一行第一列:1
第二行第二列:1+4
第三行第三列:1+4+8
第四行第四列:1+4+8+16
第五行第五列:1+4+8+16+20
由此我们就可以发现个规律
第一行第一列:1=1+(1-1)*4
第二行第二列:5=1+(1-1)*4+(2-1)*4
第三行第三列:13=1+(1-1)*4+(2-1)*4+(3-1)*4
第四行第四列:32=1+(1-1)*4+(2-1)*4+(3-1)*4+(4-1)*4
第五行第五列:41=1+(1-1)*4+(2-1)*4+(3-1)*4+(4-1)*4+(5-1)*4
故第n行第n列所填数=1+(1-1)*4+(2-1)*4+(3-1)*4+........(n-1)*4
这个公式还可以进一步的化简,但是为了后面写程序的方便就不再化简。
现在我们就可以写出程序
package suanfa;
import java.util.Scanner;
public class Maincaogap {
public static void main(String[] args) {
Scanner sc=new Scanner (System.in);
System.out.print("请输入你想查询的行列数:");
int n=sc.nextInt();
int sum=1;//对应上述公式中的“1”
for(int i=0;i<n;i++)
{
int num=i*4;//因为是从0开始到20的整数,所以i的取值已经是n-1的值了
sum+=num;
}
System.out.print(sum);
}
}
运行结果如下
这就是今天的分享,欢迎大家在品论区留下更好的想法或者解决蛇形填数的方法