不要二

博客围绕二维数组中放蛋糕的题目展开。重点是在二维数组各坐标放蛋糕,某位置放蛋糕后,与其欧几里得距离为2的位置不能放。通过对距离表达式分解得出限制条件,解题时用二维数组,初始元素为1,放蛋糕处计数并标记特定位置为0。

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

题目解析:
本题的重点是要读懂题意,并且需要多读两遍,才能读懂,本题本质就是在二维数组中每个坐标去放蛋糕,
一个坐标位置放了蛋糕,跟他欧几里得距离为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。
解题思路:
将题目像上面那样一剖析,看似复杂的一个题就变得很简单了,只需要一个二维数组buff,先将数组的每一个元素初始化为1,表示可以放蛋糕,如果buff[i][j]可以放蛋糕,先将计数器++,然后将buff[i][j+2]和buff[i+2][j]处标记为不能存放蛋糕,即为0。
图解思路:
在这里插入图片描述

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    int w,h,ret = 0;
    cin >> w >> h;
    vector<vector<int> > buff;
    buff.resize(w);
    for(auto &e:buff)
        e.resize(h, 1);
    
    for(int i = 0; i < w; ++i)
    {
        for(int j = 0; j < h; ++j)
        {
            if(buff[i][j] == 1)
            {
                ++ret;
                if((i+2) < w)
                    buff[i+2][j] = 0;
                if((j+2) < h)
                    buff[i][j+2] = 0;
            }
        }
    }
    
    cout << ret << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值