题目描述:
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
示例1
输入
3 2
输出
4
思路:
1 1 * * 1 1 * *
1 1 * * 1 1 * *
* * 1 1 * * 1 1
* * 1 1 * * 1 1
*对于点的x,y坐标,如果x除4余0或者除4余1,则y除4余0或者除4余1的点flag设为1
*如果x除4余2或者除4余3则y除4余2或者除4余3的flag设置为1
*统计flag = 1的个数即可
*有简单算法,找规律,将所有点放在同一行,则问题变成了隔一个空放一个蛋糕
if(r%4==0||c%4==0){n=r*c/2;}//如果能整除4 那么蛋糕个数为网格个数的一半
else{ n=r*c/2+1;}//不能被4整除 将蛋糕每隔一个空放一个 可以放多少 奇数的一半+1
1 import java.util.*;2
3 public classBuyaoer {4
5 public static voidmain(String[] args) {6 //TODO Auto-generated method stub
7 Scanner sc = newScanner(System.in);8 int x =sc.nextInt();9 int y =sc.nextInt();10 sc.close();11 //System.out.println(x);12 //System.out.println(y);
13 int[][] flag = new int[x][y];14 int count = 0;15 for(int i = 0; i < x; i++){16 if(i%4 == 0 || i%4 == 1){17 for(int j = 0; j < y; j++){18 if(j%4==0||j%4==1){19 //System.out.println(i);20 //System.out.println(j);
21 flag[i][j] = 1;22 count++;23 }24 }25 }else{26 for(int j=0; j
30 flag[i][j]=1;31 count++;32 }33 }34 }35 }36
37 System.out.println(count);38 }39
40 }