網格問題

題目描述:二貨小易有一個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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章