NOIP2017提高組day2T1題解(乳酪)

2021-08-13 05:37:59 字數 1670 閱讀 7107

這道題還是很水的,在下拿了滿分。

並沒有用什麼高階的演算法,我講一下基本思路。

我們把每個洞都視為乙個節點。

我們讀入相關資料後,就先進行預處理,通過每個節點的資訊和題目的規定,建立一張無向圖,兩個能相通的洞對應的節點之間有一條無向邊,這樣我們就建立好了一張圖。

在建圖的時候,我們還需要幹一件事,那就是記錄哪些是起點,哪些是終點。

接下來我們就對每乙個節點進行bfs就行了,這樣就可以了。

我們再結合**講解一下:

#include

#include

#include

#include

#include

//保險起見,沒用萬能標頭檔案

using

namespace

std;

//手寫佇列,用於bfs

struct gque

void gpush(int n)

int gtop()

void gpop()

};gque q;

int t;

int n,h,r;

//儲存圖

vector

//儲存起點

vector

s;//儲存終點(這樣便於判斷)

int tvis[1005];

int indd[1005][3];

int vis[1005];

int sflag,tflag;

int flag;

//計算兩點距離

long

long ggetdist(int xx,int yy,int zz,int ***,int yyy,int zzz)

//bfs,為了反作弊,用了自己的名字縮寫

int cgg(int cur)}}

}//沒找到,返回不可以

return0;}

int main()

//接下來是一堆初始化,由於是多組資料,這非常重要。

memset(tvis,0,sizeof(tvis));

for(int i=0;i0,tflag=0;//用於記錄是否有終點和起點

for(int i=0;i0;//用於判斷乙個節點是否既是起點又是終點

if(indd[i][2]+r<=0||indd[i][2]-r>=h)

if(indd[i][2]<=r&&indd[i][2]>-r)

if(indd[i][2]>=(h-r)&&indd[i][2]<(h+r))

if(flag==2)

for(int j=i+1;j//遍歷當前節點是否與其他節點聯通(建圖)

if(ggetdist(indd[i][0],indd[i][1],indd[i][2],indd[j][0],indd[j][1],indd[j][2])<=1ll*4*r*r)}}

if(flag==2)

if(!tflag||!sflag)

flag=0;//用於記錄是否有解

//開始bfs

for(unsigned

int i=0;i//遍歷每乙個起點

if(cgg(s[i]))

}//輸出結果

if(flag)else

}return

0;}

總結:真心不難,非常簡單。

NOIP2017提高組Day 2 乳酪

現有一塊 酪,它的高度為 h,它的長度和寬度我們可以認為是無限大的,乳酪中間有許多 半徑相同 的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中,乳酪的下表面為z 0,乳酪的上表面為z h。現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的座標。兩相切或是相交,則 ...

Noip2017提高組 乳酪

noip 2017 提高組 不怎麼難啦 思路如下 首先先寫乙個函式判斷兩個洞是否相連,即兩洞之間距離是否小於等於球直徑 注意是直徑 struct dong dong p 1001 bool pd dong a,dong b 第二個難點在於如何判斷是否可以穿過乳酪,對此我們可以模擬老鼠鑽洞 run函式...

NOIP2017提高組 列隊

noip2017提高組 day2 t3 sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n m 名學生,方陣的行數為 n,列數為 m 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...