二货小易有一个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)
输出描述:
输出一个最多可以放的蛋糕数
Tips:数组定义一定要放在main函数外,否则无法通过编译,
具体报错如下:
C6262 函数使用了堆栈的“4016036”个字节:
超过了 /analyze:stacksize '16384'。
请考虑将某些数据移到堆中。
测试:输入6 7
输出:22
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//用贪心的思想来做,开始将棋盘a全置为0,0代表放入蛋糕,-1代表不能放入
//从左向右从上到下遍历棋盘开始依此放蛋糕,然后将该块蛋糕上下左右欧几里得距离为2的点全部标记为-1,
//意思为该点不能再放入蛋糕,如果下一步扫到的-1,则跳过该点,
//如果扫到0,则ret++, 继续把周围距离为2的点标记为-1。
int a[1002][1002] = { 0 }; //w和h的最大值都为1000
int main()
{
//int a[1002][1002] = { 0 }; //w和h的最大值都为1000
int w = 0, h = 0, ret = 0;
cin >> w >> h;
if ((w >= 1 && w <= 1000) && (h >= 1 && h <= 1000))
{
for (size_t i = 0; i < w; i++)
{
for (size_t j = 0; j < h; j++)
{
if (a[i][j] == 0)
{
ret++;//a[i][j]为0说明可以放
if ((i + 2) < w)//欧几里得距离:((i-i+2)*(i-i+2)+(j-j)*(j-j)) = (2*2+0) = 4,根号为2
{
a[i + 2][j] = -1;
}
if ((j + 2) < h)//欧几里得距离:((i-i)*(i-i)+(j-j+2)*(j-j+2)) = (0+2*2) = 4,根号为2
{
a[i][j + 2] = -1;
}
}
}
}
cout << ret << endl;
}
return EXIT_SUCCESS;
}