在幾何上,任何正方形都有一個唯一的中心點。在畫有格子線的平面上,只有在正方形的邊長為奇數時才成立。
因為任何一個奇數都可以寫成2k+1。所以若我們定義某一個正方形的大小為k,也就是表示他的邊長為2k+1。
現在我們要依照下面的規則來定義一個正方形所構成的圖案:
1. 最大的正方形大小為k ( 也就是邊長為 2k + 1 ) 並且被放置在一個大小為1024的正
方形的正中央。
2. 可以允許使用的正方形大小最小為1,最大為512。因此 1<= k <= 521。
3. 所有 k>1 的正方形,以其4個角為中心點各有一個大小為 k div 2 的正方形(在這
裡div指的是整數的除法,例如:9 div 2 = 4)
因此,給你一個k值,根據以上的規則,我們可以畫出一個唯一的圖案。
而螢幕上的每一個點可能落在0個或多個正方形中。(我們定義若點剛好落在邊上,亦視為落在此正方形中)。
所以如果最大的正方形的k=15,我們可以畫出以下的圖案:
寫一個程式,讀入k及某一個點的座標,輸出該點總共被多少個正方形所包圍。Input
每組測試資料一列,每列有3個整數。分別代表k及一個點的座標。
最後一列的內容為3個0,代表輸入結束。
Output
每組測試資料輸出一列。
輸出該點總共被多少個正方形所包圍,輸出長度為3,靠右對齊。
Sample Input
500 113 941
300 100 200
300 1024 1024
0 0 0
Sample Output
5
0
1
蠻容易的一題
使用簡單的遞迴就可以解決了
#include <stdio.h>
#include <stdlib.h>
int T_Count; //總共被幾個正方形包圍
int px,py; //審核的點
void Main_Process(int k,int sx,int sy) //遞迴,計算答案
{
int tmpk;
tmpk = k/2;
if(k == 0) return; //終止條件
tmpk = k/2;
if(((sx - k)<= px) && //審核點有在這個正方形內,累加計數
((sx + k)>= px) &&
((sy - k)<= py) &&
((sy + k)>= py))
{
T_Count++;
}
Main_Process(tmpk,sx+k,sy+k); //上下左右延伸出來的正方形
Main_Process(tmpk,sx+k,sy-k);
Main_Process(tmpk,sx-k,sy+k);
Main_Process(tmpk,sx-k,sy-k);
}
int main()
{
int k;
while(scanf("%d %d %d",&k,&px,&py)==3)
{
if((k == 0) && (px == 0) && (py == 0)) break;
T_Count = 0;
Main_Process(k,1024,1024); //起始點為畫面的正中間 1024 , 1024
printf("%3d\n",T_Count);
}
return 0;
}
