不要二
【题目解析】:
本题看起来很难,实际是一个中等难度的题。本题如果没记错,是一个往年网易的笔试题,大家可以看到大
厂的题的难度。
本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕,
一个坐标位置放了蛋糕,跟他欧几里得距离为 2 的位置不能放蛋糕,这个就是关键点。对于两个格子坐标
(x1,y1),(x2,y2) 的欧几里得距离为 : ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。
也就是说: 如果 (x1,y1) 放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4 (x2,y2) 不能放蛋
糕。
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4 看起来是一个无解的表达式。
但是可以进行加法表达式分解:
1+3=4
3+1=4
2+2=4
0+4=4
4+0=4
仔细分析前三个表达式是不可能的,因为 (x1-x2) * (x1-x2) 表达式结果不能等于 2 3
也就是说 ( (x1-x2) * (x1-x2) (y1-y2) * (y1-y2) ) 两个表达式一个等于 0 ,一个等于 4.
可以看出:假设放蛋糕的位置是 (x1,y1) ,则不能放蛋糕的位置 (x2,y2) ,满足 x1==x2,y1-y2==2 或者 x1-
x2==2,y1==y2.
【解题思路】:
仔细读理解了上面的题目解读,本题就非常简单了,定义一个二维数组, resize 开空间并初始化,每个位置
初始化为 0 ,表示当蛋糕, a[i][j] 位置放蛋糕,则可以标记处 a[i][j+2] a[i+1][j] 位置不能放蛋糕,遍历一遍二
维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int col = in.nextInt();
int row = in.nextInt();
int count = 0;
int[][] array = new int[row][col];
for(int i = 0;i < row;i++) {
for(int j = 0;j < col;j++) {
if(array[i][j] == 0) {
count++;
if(i+2 < row) {
array[i+2][j] = 1;
}
if(j+2 < col) {
array[i][j+2] = 1;
}
}
}
}
System.out.println(count);
}
}

 posted on 2023-10-31 21:05  dapaige  阅读(10)  评论(0)    收藏  举报  来源