在幾何上,任何正方形都有一個唯一的中心點。在畫有格子線的平面上,只有在正方形的邊長為奇數時才成立。
因為任何一個奇數都可以寫成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;
}

文章標籤
全站熱搜
創作者介紹
創作者 HydraSmith 的頭像
HydraSmith

Hydra Smith

HydraSmith 發表在 痞客邦 留言(0) 人氣(91)