【牛客】[编程题] 不要二 C++

1.题目描述

链接:https://www.nowcoder.com/questionTerminal/1183548cd48446b38da501e58d5944eb

二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) *
(y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。

2.思路分析

  1. 建立一个二维的vector数组,然后将所有的数字全置为0
  2. 循环遍历数组,然后找一个一个找值为1 的数字
  3. 将这个数字 (i+ 2)和 (j+2) 的数字置为0
  4. 然后统计ret的个数,打印

3.代码实现

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

int main()
{
    int W,H,ret = 0;
    // 利用vector的二维数组来解决
    vector<vector<int>> v;
    cin >> W >> H;
    // 开辟横排空间
    v.resize(W);
    // 开辟列排空间
    // 先将所有的数字全置为1,最后将不符合的置为0
    for(auto &e : v)
    {
        
        e.resize(H, 1);
    }
    
    // 循环遍历所有的数字
    for(int i = 0; i < W; i++)
    {
        for(int j = 0; j < H; j++)
        {
            if(v[i][j] == 1)
            {
                ret++;
                // 任意横排或者裂开之间相距2,就可以直接置为0
                // ret控制最火有多少个蛋糕
                if((i + 2) < W)
                    v[i + 2][j] =0;
                if((j + 2) < H)
                    v[i][j + 2] =0;
            }
        }
    }
    // 打印
    cout << ret <<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43967449/article/details/106612250