每日一题系列:不要二

二货小易现有一个W*H的网格盒子,网格的行编号为0 ~ H-1,网格的列编号为0 ~ W-1。
每个格子可放1块蛋糕,任意两块蛋糕的欧几里得距离不能等于2

对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
[(x1-x2) * (x1-x2)+(y1-y2) * (y1-y2)]的平方根
小易想知道最多可放多少块蛋糕在网格盒子里

输入:每组数组包含网格长宽W,H,用空格分割(1<=W、H<=1000)
输出:最多可以放的蛋糕数

解题思路

我们先来看一下欧几里得距离等于2的情况:
[(x1-x2) * (x1-x2)+(y1-y2) * (y1-y2)]的平方根=2

我们把两边平方就是

[(x1-x2) * (x1-x2)+(y1-y2) * (y1-y2)]=4

我们把(x1-x2) * (x1-x2)看成一个整体a, (y1-y2) * (y1-y2)看成一个整体b
a+b=4无非如下几种情况
1+3=4
3+1=4
2+2=4
4+0=4
0+4=4

a和b又是某个整数x1-x2和y1-y2的平方,也就是a和b只能是整数
所以合理的情况只有
4+0和0+4

那么代入到题目中就是x1-x2=0&&y1-y2=2 或者x1-x2=2&&y1-y2=0
换句话说,就是横向和纵向距离2是不能放蛋糕的(ps:这里需要考虑当前位置距离2有没有越界)

代码如下:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int w=scanner.nextInt();
        int h=scanner.nextInt();
        int count=0;
        int[][]arr=new int[w][h];
        //数组默认里面为0,那我们规定为0可以放,为1不可以放
        for(int i=0;i<w;i++) {
        	for(int j=0;j<h;j++) {
        		if(arr[i][j]==0) {
        			count++;
        			if(i+2<w) {//防止越界
        				arr[i+2][j]=1;
        			}
        			if(j+2<h) {
        				arr[i][j+2]=1;
        			}
        		}
        	}
        }
        System.out.print(count);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值