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

该博客讨论了一个关于在W*H的网格中放置蛋糕的问题,其中任意两块蛋糕的欧几里得距离不能等于2。通过分析欧几里得距离公式,找出不能放置蛋糕的条件,并使用二维数组标记这些位置,从而确定可以放置蛋糕的最大数量。最终,通过遍历并用代码实现求解这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:二货小易有一个W*H的网格盒子,网格的行编号为0 ~ H-1,网格的列编号为0 ~ W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
解析:本题目主要难度在于读懂题目。
剖析一下题干:需要找到可以放蛋糕的格子的个数;反向思考,创建一个二维数组,只需要找到不能放蛋糕的格子,就能得到可以放蛋糕的格子。
那么怎么找到不能放蛋糕的格子呢? 仔细看欧几里得距离方程式,能得到:只需要让(x1-x2)*(x1-x2)+ (y1-y2) * (y1-y2) = 4 即可;
乍一看,这个方程十分麻烦,但是可以进行加法表达式分解。
0+4 = 4 ;1+3 = 4 ;2+2 = 4 ; 3+1 = 4 ; 4+0 = 4;
分析可知,加号两边的式子 无法等于 1 2 3,即只存在剩下的两种情况。
此时,可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足x1= =x2,y1-y2 == 2或者x1-x2 == 2,y1 == y2.
代码:
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num1 = in.nextInt();
        int num2 = in.nextInt();
        int[][] arr = new int[num1][num2];
        int count = 0;
        for(int i = 0;i < num1;i++) {
            for(int j = 0;j < num2;j++) {
                if(arr[i][j] == 0) {
                    count++;
                    //让不能放蛋糕的位置变为1
                    if(i+2 < num1) {
                        arr[i+2][j] = 1;
                        }
                    if(j+2 < num2) {
                        arr[i][j+2] = 1;
                        }
                }
            }
        }
        System.out.println(count);
    }
}
1.求解涂棋盘问题。 小易有一块n*n的棋盘,棋盘的每一个格子都为黑色或者白色,小易现在要用他喜欢的红色去涂棋盘.小易会找出棋盘的某一中,拥有相同颜色的最大区城去涂画,帮助小易算算他会图多少个棋格。 输入描述:输入数据包括1+1行,第一行为一个整数n(1<=n<=50),即棋盘的大小;接下来的n行每行 一个字符串表示第{行棋盘的颇色,'W'表示白色,'B'表示照色. 输出描述:输出小易会涂画的区域大小 输入样例: 3 BWW BBB BWB 样例输出: 3 #include <iostream> #include <vector> #include <algorithm> using namespace std; // 定义方向数组,用于在棋盘上移动 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; // 深度优先搜索函数,用于标记连通区域 void dfs(vector<vector<char>>& board, int x, int y, char color, vector<vector<bool>>& visited) { int n = board.size(); int m = board[0].size(); visited[x][y] = true; for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny] && board[nx][ny] == color) { dfs(board, nx, ny, color, visited); } } } int main() { int n; cin >> n; vector<vector<char>> board(n, vector<char>(n)); vector<vector<bool>> visited(n, vector<bool>(n, false)); int maxArea = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> board[i][j]; } } // 遍历棋盘,对每个未访问的格子进行DFS for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (!visited[i][j]) { int area = 0; dfs(board, i, j, board[i][j], visited); for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { if (visited[x][y]) { area++; visited[x][y] = false; // 重置visited数组 } } } maxArea = max(maxArea, area); } } } cout << maxArea << endl; return 0; } 实验代码能够完成吗?
最新发布
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值