2010年6月21日 星期一

Problem 10182 Bee Maja,蜜蜂座標的轉換

Maja 是一隻蜜蜂,她和其他數以千計的蜜蜂住在鬧區,這鬧區是一種以六邊形緊鄰的方式排列。
但問題就出在 Willi 告訴 Maja,在哪裡可以與他會面,要知道,Willi 是一個懶惰的蜜蜂,而 Maja 是一個勤勞的蜜蜂,所以他們對於鬧區有不同的座標看待方式。
以下為 Maja 看待鬧區方式:
而以下為 Willi 看待鬧區方式:
問題就是,我輸入 Willi 座標,請你把它轉換為 Maja 座標。

首先,我們要找出座標規則,如同下圖所示:接著判斷它的移動方向,從 1 開始第一次循環,只跑一次,它是從 0, 0往下,再來往左上、上、右上、右下到 6 為止,接著 7 進入第二循環,跑兩次,往下,左下(注意,右下每次執行階會與循環次數少 1,所以第一次循環沒有執行)、左上、上、右上、右下到 17 為止。如此如此執行到大於等於 100000 為止。
依照以上觀念寫成 C 語言程式碼如下:
#define SIZE 100000

struct point
{
int x, y;
};
struct point p[SIZE + 1];
int index;
void create()
{
p[1].x = 0, p[1].y = 0;
index = 2;
int nowI = 0, nowJ = 0, count, num;
for (num = 1; index <= SIZE; num ++)
{
for (count = 0; count < num && index <= SIZE; count ++, index ++)
p[index].x = nowI, p[index].y = ++ nowJ;
for (count = 0; count < num - 1 && index <= SIZE; count ++, index ++)
p[index].x = -- nowI, p[index].y = ++ nowJ;
for (count = 0; count < num && index <= SIZE; count ++, index ++)
p[index].x = -- nowI, p[index].y = nowJ;
for (count = 0; count < num && index <= SIZE; count ++, index ++)
p[index].x = nowI, p[index].y = -- nowJ;
for (count = 0; count < num && index <= SIZE; count ++, index ++)
p[index].x = ++ nowI, p[index].y = -- nowJ;
for (count = 0; count < num && index <= SIZE; count ++, index ++)
p[index].x = ++ nowI, p[index].y = nowJ;
}
}
最後在主程式如此呼叫:
create();
int n;

while (scanf("%d", &n) == 1)
printf("%d %d\n", p[n].x, p[n].y);

By David.K

p10182題目連結
回ACM題庫目錄
回首頁

沒有留言: