有点二的 不要二 问题

二货小易有一个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)

输出描述:

输出一个最多可以放的蛋糕数

思路:

任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根

 

看到这个要求,也会感到这个题不太容易。而我也被这个要求带偏了。

看到这个要求,我想用两个参数控制距离,后来发现有点难实现(至少以我的水平,只能O(∩_∩)O哈哈~)!

但我发现,要这个要求成立,x1-x2或者y1-y2可能为小数。而每个格子都可以放蛋糕,怎么能出现小数个格子呢?

所以分解一下要求( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) )=4;

  

 (x1-x2)^2(y1-y2)^2
13
31
22
40
04

 

 前三种情况肯定不能成立!所以我们只需要控制一个放蛋糕的位置上下左右距离2个格子的位置不能放置蛋糕!

 

代码实现:

int main()
{
    int W,H;
    cin>>W>>H;
    vector<vector<int>> map(H,vector<int>(W,0));
    int count=0;
   //输入完成
    for(size_t i=0;i<H;++i)
    {
        for(size_t j=0;j<W;++j)
        {
            if(map[i][j]==0)
            {
                map[i][j]=1;
                count++;
                if(j+2<W&&map[i][j+2]==0)
                map[i][j+2]=2;
                if(i+2<H&&map[i+2][j]==0)
                map[i+2][j]=2;
            }
            
        }
    }
   //打印结果
    cout<<count<<endl;
    return 0;
}

本篇博文到这里就结束了,谢谢大家的观看!

你们的 【三连】 是给Qyuan最大的肯定!

↓          ↓           ↓

注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!

如果需要练习的小伙伴,可以打开下方链接:

https://www.nowcoder.com/practice/1183548cd48446b38da501e58d5944eb?tpId=85&&tqId=29840&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值