题目描述:二货小易有一个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
解题思路:当欧几里得距离等于2的情况就是只有(x1-x2)=2或-2&& (y1-y2)=0、(x1-x2)=0 && (y1-y2)=2或-2两种情况。那我们只要遍历一遍所有的格子即可,用二维数组G来标记,1表示可以放蛋糕,0表示不可以放。从G[0][0]开始,G[0][0]可以放蛋糕,G[0][2]和G[2][0]不可以放。每遍历一个格子,都要排除距离此个格子为2的两个格子。
#include<iostream>
#include<string.h>
using namespace std;
int G[1002][1002], w, h;//长,宽
bool isOk(int x, int y)
{
return(x < w && y < h);
}
int main()
{
while (cin >> w >> h)
{
memset(G, 0, sizeof(G));//给每个格子初始化为0
int count = 0;
int i, j;
for (i = 0; i < w; i++)
{
for (j = 0; j < h; j++)
{
if (G[i][j] == 0)//遍历到的G[i][j]==0的个数是可以放蛋糕的个数
{
count++;
if (isOk(i + 2, j))
{
G[i + 2][j] = 1;
}
if (isOk(i, j + 2))
{
G[i][j + 2] = 1;
}
}
}
}
cout << count << endl;
}
return 0;
}