题目
描述
二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
示例1
输入:3 2
输出:4
解题
由题目可知( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根不可以等于2,
也就是(x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) 的值不能等于4。
其中两个数相加等于4的情况有这几种:0+4=4, 1+3=4, 2+2=4。这三种情况中,只有0+4=4是符合的,因为其与的两种情况的x1-x2或者y1-y2不为整数,只有0+4=4的x1-x2和y1-y2都为整数。所以格子能被占用的条件是:这个格子上下左右隔两个格子都不能被占用。
如果一个格子的坐标为(i,j),如果不越界,只有当(i+2, j),(i-2, j),(i, j+2),(i, j-2)这四个格子都没有被占用,(i,j)这个格子才能被占用。值得注意的是,要提前判断下标是否会越界。
代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int W = sc.nextInt();
int H = sc.nextInt();
int array[][] = new int[W][H]; //生成网格
int flag = 1; //标志位,用来判断上下左右的格子是否都没有被占用
int count = 0;
for(int i=0; i<W; i++){
for(int j=0; j<H; j++){
flag = 1;
if(j+2<H && array[i][j+2] == 1){
flag = 0;
}
if(j-2>=0 && array[i][j-2] == 1){
flag = 0;
}
if(i-2>=0 && array[i-2][j] == 1){
flag = 0;
}
if(i+2<W && array[i+2][j] == 1){
flag = 0;
}
//如果flag没有变成了0,就说明这个格子可以被占用。
if(flag == 1){
count++;
array[i][j] = 1;
}
}
}
System.out.println(count);
}
}