蓝桥杯JAVA——蛇形填数(内含标准解法和取巧找规律型解法)

文章介绍了在蓝桥杯竞赛中遇到的一道蛇形填数问题,标准解法涉及对奇偶行和列的处理。作者发现一种简化方法,通过观察斜线上数字的规律,找到第n行第n列的数字可以用1+(1-1)*4+(2-1)*4+...+(n-1)*4的公式计算,简化了原本的程序实现。
摘要由CSDN通过智能技术生成

今天在做蓝桥杯的真题练系的时候发现了一个有意思的题目,蛇形填数题,题目如下

标准的解法应该是分别对奇数和偶数的行和列做不同的操作,对内部的数据也以右上,左下两个方向分开看待(行数+列数=奇数时是左下方向,行数+列数=偶数时是右上方向)。代码如下

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);//输出第二十行第二十列所填的数字
	    }
}

运行结果如图:

 

其实也是一种很巧妙地解法,但是我还是觉得有一些繁琐,所以就往后面又填了两行

126715
3581417
49131226
1012192542
1120243341

 我们就可以注意到,从表中的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);
        
        }
        
    }

运行结果如下


这就是今天的分享,欢迎大家在品论区留下更好的想法或者解决蛇形填数的方法 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值