二货小易现有一个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);
}
}