蛇形矩阵蒸滴好玩

先来看看题目:

描述

康托尔三角是由著名数学家康托尔设计的一个整数三角,可以用来证明所有有理数与自然数一一对应,亦即有理数集是一个可数集。康托尔三角的构造如下:
01 02 06 07 15 16 28 29 45 46
03 05 08 14 17 27 30 44 47
04 09 13 18 26 31 43 48
10 12 19 25 32 42 49
11 20 24 33 41 50
21 23 34 40 51
22 35 39 52
36 38 53
37 54
55
它的填充规律是:将自然数按照从小到大的顺序从左上角往右下角按照蛇形排列:从左下到右上,再从右上到左下,每当到达边界之后就改变填充方向。
按照这种方式填充的三角形,给定行值和列值之后,填充的自然数是确定的。
规定行值和列值均从1开始计算。用(行,列)的方式进行描述。那么有:
(1,1)为1,(1,4)为7,(3,4)为18,(6,5)为51,(8,2)为38.
给定一个行值r和列值c,请求出对应的自然数。题目保证1≤r,c≤10,000

格式

输入格式

一行,两个整数,中间用空格分隔,表示行值r和列值c。

输出格式

一个正整数,表示该位置应填充的数据

样例

输入样例

5  4

输出样例

33

首先我想到的是用数组将这个三角形打表,但是很可惜,超内存了!后面苦思冥想,发现了其中的规律。

现在假设轮替的轮数为 turn ,我们可以发现通过所给出的行值和列值得到所属的轮数。比如数字9(2,3),11(5,1)。turn=r+c-1.

知道轮数之后一切都好办了,这时候我们分turn为奇数和偶数考虑,利用等差数列求和公式来计算。

超内存代码:

public class Main{
        Scanner s=new Scanner(System.in);
        int r,c;
        int[][] SnakeMatrix=new int[10000][];
        int turn=1,cnt=1,i,j;
        for(i=0;i<10000;i++) {
            SnakeMatrix[i]=new int[10000-i];
        }
        while(turn<=10000) {//模拟生成蛇形矩阵
            if(turn%2==1) {
                for(i=turn-1,j=0;i>=0&&j<=turn-1;i--,j++) {
                    SnakeMatrix[i][j]=cnt++;
                }
            }else {
                for(i=0,j=turn-1;i<=turn-1&&j>=0;i++,j--) {
                    SnakeMatrix[i][j]=cnt++;
                }
            }
            turn++;
        }
}

 

AC代码 


import java.util.Scanner;

public class SnakeMatrix {
    public static void main(String[] args) {
        Scanner get=new Scanner(System.in);
        int r,c,turn,ans;
        int n=10;
        r=get.nextInt();
        c=get.nextInt();
        turn=r+c-1;
        if(turn%2!=0){
            ans=(turn+1)/2*turn-(turn-c);
        }else{
            ans=turn/2*(turn+1)-c+1;
        }
        System.out.println(ans);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值