這道題還是很水的,在下拿了滿分。
並沒有用什麼高階的演算法,我講一下基本思路。
我們把每個洞都視為乙個節點。
我們讀入相關資料後,就先進行預處理,通過每個節點的資訊和題目的規定,建立一張無向圖,兩個能相通的洞對應的節點之間有一條無向邊,這樣我們就建立好了一張圖。
在建圖的時候,我們還需要幹一件事,那就是記錄哪些是起點,哪些是終點。
接下來我們就對每乙個節點進行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 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...