二货小易有一个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)
输出描述
输出一个最多可以放的蛋糕数
示例1: 输入 3 2 输出 4
这里我想了很多办法,最后还是选择一个个遍历,再得到结果。代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int w, h;
while (cin >> w >> h)//循环输入行w,和列h
{
vector<vector<int>>a(w);//定义一个动态二维数组
for (int i = 0; i < w; i++)//将元素扩充到a[w][h]
{
a[i].resize(h, 1);//元素全部扩充进去,初始化为1
}
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
if (a[i][j] == 1)
{
if (i + 2 < w)
{
a[i + 2][j] = 0;
}
if (j + 2 < h)
{
a[i][j+2] = 0;
}
}
}
}
int count = 0;
for (int i = 0; i < w; i++)//遍历数组,统计数组元素为1的个数
{
for (int j = 0; j < h; j++)
{
if (a[i][j] == 1)
{
count++;
}
}
}
cout << count << endl;
}
}
重点的代码如下:
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
if (a[i][j] == 1)
{
if (i + 2 < w)
{
a[i + 2][j] = 0;
}
if (j + 2 < h)
{
a[i][j+2] = 0;
}
}
}
}
上述代码是用来实现在遍历时将a[i][j]距离为2的元素的值赋值为0