這題雖然看起來很毒瘤,暴力分超級少還超級難打,但是如果靜心想還是可以想到很多結論的,可是我在比賽的時候spfa的陣列開小了。。。
首先我們來看兩個結論
結論1:任何乙個傳送門只會進/出一次(這個是十分顯然的)
結論2:對於在兩個不同的地方射出兩個傳送門的情況,我不可能回到第乙個射出的傳送門走到第二個傳送門(因為這相當與你先走到射第二個傳送門的位置,然後在走回第乙個傳送門)
有了這兩個結論,我們就可以發現這題其實就相當於
1:上下左右走1步
2:往乙個方向射出乙個傳送門,並且在若干步後通過另外乙個後面射出的傳送門走到那裡
我們可以先預處理出每乙個點想要構造出乙個傳送門並且走進去所需的時間,那麼2中的四種走法所耗的時間其實是一樣的
一共有n*n *8條邊,可以打一發spfa
#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fo1(i,b,a) for(i=b;i>=a;i--)
using
namespace
std;
const
int maxn=1305;
intmap[maxn][maxn],cc[maxn][maxn],f[maxn][maxn],g[maxn][maxn][5][3];
int go[5][3];
int h[maxn*maxn*2][3];
bool bz[maxn][maxn];
int i,j,k,l,m,n,x,y,z,be1,be2,now,ed1,ed2;
char ch;
void make_cc()}}
}void make_g()
fo(i,1,n)
fo1(j,m,1) if (map[i][j]==1) z=j-1; else
fo(j,1,m)
fo(i,1,n) if (map[i][j]==1) z=i+1; else
fo(j,1,m)
fo1(i,n,1) if (map[i][j]==1) z=i-1; else
}void geans()}}
}fo(k,1,4)}}
bz[h[j][1]][h[j][2]]=false;
}}int main() else
if (ch=='c') else
map[i+1][j+1]=2;
}n=n+2; m=m+2;
fo(i,1,n)
fo(j,1,m)if (map[i][j]!=1)
}make_cc();
make_g();
h[1][1]=be1; h[1][2]=be2;
memset(f,61,sizeof(f));
f[be1][be2]=0;
geans();
printf("%d\n",f[ed1][ed2]);
return
0;}
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 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...
NOIP 2017 提高組 寶藏
傳送門 參與考古挖掘的小明得到了乙份藏寶圖,藏寶圖上標出了 n nn 個深埋在地下的寶藏屋,也給出了這 n nn 個寶藏屋之間可供開發的 m mm 條道路和它們的長度。小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發...