编程题——不要二
题目描述:
二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数
示例:
输入
3 2
输出
4
程序代码如下:
#include <iostream>
#include <vector>
using namespace std;
/*这个问题看似复杂,实际上分解后就会很简单
*题目要求欧几里得距离为2的位置不能放蛋糕
*即(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)是平方式,结果只有0和4
*所以如果(x1,y1)放了蛋糕,则(x1,y1+/-2),(x1+/-2,y1)不能放蛋糕
*/
int main()
{
int W, H,ret = 0;
cin >> W >> H;
vector<vector<int>> a;//创建二维数组
a.resize(W);//W行
for (auto& e : a)
e.resize(H, 1);//H列,数组初始化为全1
for (int i = 0; i < W; ++i)
{
for (int j = 0; j < H; ++j)
{
if (1 == a[i][j])//如果值为1说明可以放蛋糕,所以蛋糕数+1
{
++ret;
if ((i + 2) < W)//将横向欧几里得距离为2的位置置0表示不能放蛋糕
a[i + 2][j] = 0;
if ((j + 2) < H)//将纵向欧几里得距离为2的位置置0表示不能放蛋糕
a[i][j + 2] = 0;
}
}
}
cout << ret << endl;
return 0;
}
程序运行结果如下: