C 第七屆藍橋杯決賽之廣場舞

2021-08-01 13:13:03 字數 3722 閱讀 4770

題目:

lq市的市民廣場是乙個多邊形,廣場上鋪滿了大理石的地板磚。

地板磚鋪得方方正正,就像座標軸紙一樣。

以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點(如果在廣場內)。

廣場的磚單調無趣,卻給跳廣場舞的市民們提供了絕佳的參照物。每天傍晚,都會有大批市民前來跳舞。

舞者每次都會選一塊完整的磚來跳舞,兩個人不會選擇同一塊磚,如果一塊磚在廣場邊上導致缺角或者邊不完整,則沒人會選這塊磚。

(廣場形狀的例子參考【圖1.png】)

現在,告訴你廣場的形狀,請幫lq市的市長計算一下,同一時刻最多有多少市民可以在廣場跳舞。

【輸入格式】

輸入的第一行包含乙個整數n,表示廣場是n邊形的(因此有n個頂點)。

接下來n行,每行兩個整數,依次表示n邊形每個頂點的座標(也就是說廣場邊緣拐彎的地方都在磚的頂角上。資料保證廣場是乙個簡單多邊形。

【輸出格式】

輸出乙個整數,表示最多有多少市民可以在廣場跳舞。

【樣例輸入】

53 3

6 44 1

1 -1

0 4【樣例輸出】

7【樣例說明】

廣場如圖1.png所示,一共有7塊完整的地板磚,因此最多能有7位市民一起跳舞。

【資料規模與約定】

對於30%的資料,n不超過100,橫縱座標的絕對值均不超過100。

對於50%的資料,n不超過1000,橫縱座標的絕對值均不超過1000。

對於100%的資料,n不超過1000,橫縱座標的絕對值均不超過100000000(一億)。

資源約定:

峰值記憶體消耗 < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0

注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。

注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

思路:先把所有點的最大和最小橫縱座標找出來,然後逐一判斷每個點是否在多邊形內,再找出該點和相鄰的三個點是否在多邊形內,如果全部在多邊形內,則總數加一。

**:

#include#includeusing namespace std;

struct side ;

struct point ;

int sum = 0;

bool inside_con(point *p, int num, side *s, point *p_old)

tmp_y1 = s[i].y1;

tmp_y2 = s[i].y2;

tmp_x1 = s[i].x1;

tmp_x2 = s[i].x2;

if (tmp_y1 > tmp_y2) //交換y1和y2,使得y2>y1

if (tmp_x1 > tmp_x2) //交換x1和x2,使得x2>x1

//以下為考慮各種情況,此情況為k不存在

if (s[i].flag == false)

}else

else if (s[i].k != 0)

if (tmp_xx && tmp_y <= tmp_y2 && tmp_y > tmp_y1)

}} }

if (sum == 0)

else if (sum % 2 == 0)

else }

void find(point *p, int num, int *x_max, int *y_max ,int *x_min, int *y_min)

sort(x, x + num);

sort(y, y + num);

*x_min = int(x[0]);

*x_max = int(x[num - 1]);

*y_min = int(y[0]);

*y_max = int(y[num - 1]);

}int main()

side *s = new side[num];

for (int i = 0; ix = i; real_p->y = j;

flag1 = inside_con(real_p, num, s, p);

//cout << real_p->x << " " << real_p->y << endl;

//if (flag1 == true) cout << "在多邊形中";

//else cout << "不在多邊形中";

//cout << endl << sum << endl << endl;

real_p->x = i; real_p->y = j + 1;

flag2 = inside_con(real_p, num, s, p);

//cout << real_p->x << " " << real_p->y << endl;

//if (flag2 == true) cout << "在多邊形中";

//else cout << "不在多邊形中";

//cout << endl << sum << endl << endl;

real_p->x = i + 1; real_p->y = j;

flag3 = inside_con(real_p, num, s, p);

//cout << real_p->x << " " << real_p->y << endl;

//if (flag3 == true) cout << "在多邊形中";

//else cout << "不在多邊形中";

//cout << endl << sum << endl << endl;

real_p->x = i + 1; real_p->y = j + 1;

flag4 = inside_con(real_p, num, s, p);

//cout << real_p->x << " " << real_p->y << endl;

//if (flag4 == true) cout << "在多邊形中";

//else cout << "不在多邊形中";

//cout << endl << sum << endl << endl;

if (flag1 == true && flag2 == true && flag3 == true && flag4 == true)

}} cout << sum_num;

//test_p->x = 5;

//test_p->y = 1;

//if (inside_con(test_p, num, s, p) == true) cout << "在多邊形中";

//else cout << "不在多邊形中";

//cout << endl << sum;

}

(經幾何畫板驗證)

樣例1:

1 22 5

3 35 5

5 14 -1

輸出樣例2:

1 22 5

3 35 5

6 14 -1

輸出

第七屆藍橋杯決賽試題 廣場舞

廣場舞 lq市的市民廣場是乙個多邊形,廣場上鋪滿了大理石的地板磚。地板磚鋪得方方正正,就像座標軸紙一樣。以某四塊磚相接的點為原點,地板磚的兩條邊為兩個正方向,一塊磚的邊長為橫縱座標的單位長度,則所有橫縱座標都為整數的點都是四塊磚的交點 如果在廣場內 廣場的磚單調無趣,卻給跳廣場舞的市民們提供了絕佳的...

藍橋杯 第七屆決賽 打靶

打靶 小明參加x星球的打靶比賽。比賽使用電子感應計分系統。其中有一局,小明得了96分。這局小明共打了6發子彈,沒有脫靶。但望遠鏡看過去,只有3個彈孔。顯然,有些子彈準確地穿過了前邊的彈孔。不同環數得分是這樣設定的 1,2,3,5,10,20,25,50 那麼小明的6發子彈得分都是多少呢?有哪些可能情...

第七屆藍橋杯決賽路徑之謎

路徑之謎 小明冒充x星球的騎士,進入了乙個奇怪的城堡。城堡裡邊什麼都沒有,只有方形石頭鋪成的地面。假設城堡地面是 n x n 個方格。如圖1.png 所示。按習俗,騎士要從西北角走到東南角。可以橫向或縱向移動,但不能斜著走,也不能跳躍。每走到乙個新方格,就要向正北方和正西方各射一箭。城堡的西牆和北牆...