搜尋,計算幾何 JZOJ 4016 圈地為王

2022-06-12 23:39:17 字數 1092 閱讀 4397

在\(n\)行\(m\)列的網格中,你要圈一些地。

你從左上角出發,最後返回左上角,路徑內部的區域視為被你圈住。 你不可以進入網格內部, 只能在邊上行走。 你的路徑不能在左上角以外自交, 但是邊足夠寬, 你可以重複經過而不自交。

網格中有一些格仔對你很重要,你要盡量圈住它;而另一些格仔對你有壞處,你不能圈住它。

求圈住\(i\)個重要的格仔的最小路徑長度。(\(n,m\leq 50,special block\leq 10\))

自交除了左上角完全可以被等價的方案代替,所以可以忽略它,接著如何保證好的被圈,壞的不被圈,

把乙個點向任意方向引一條射線,如果這條線穿過奇數次多邊形,那麼點在多邊形內,否則點在多邊形外,

所以可以判斷豎著的邊(橫著的邊也行),然後記錄選取的狀態跑spfa,再深搜選取

#include #include #include #define rr register

using namespace std;

struct rec; queueq;

const int dx[4]=,dy[4]=;

int spx[11],spy[11],n,m,cnt,po[11],dis[51][51][1024],ans[11];

bool v[51][51][1024]; char a[51][51];

inline signed min(int a,int b)

inline void dfs(int ss,int dep,int now)

signed main()

}memset(dis,42,sizeof(dis));

dis[0][0][0]=0,--n,v[0][0][0]=1,q.push((rec));

while (q.size()));}}

}v[t.x][t.y][t.s]=0;

}memset(ans,42,sizeof(ans));

dfs(0,0,0);

for (rr int i=1;i<=cnt;++i)

if (ans[i]<4e5) printf("%d\n",ans[i]);

return 0;

}

JZOJ 4016 圈地為王

description 在 n 行 m 列的網格中,你要圈一些地。你從左上角出發,最後返回左上角,路徑內部的區域視為被你圈住。你不可以進入網格內部,只能在邊上行走。你的路徑不能在左上角以外自交,但是邊足夠寬,你可以重複經過而不自交。網格中有一些格仔對你很重要,你要盡量圈住它 而另一些格仔對你有壞處,...

jzoj4016 圈地為王 狀壓,bfs,幾何

n m n mn m的格仔,格仔之間有道路,對於每個i ii就走過最短的迴路使得 圈住i ii個有價值的格仔 沒有圈住任何乙個壞格仔 判斷乙個點是否在乙個多邊形內,我們可以往任何乙個方向畫一條射線,如果與多邊形的交點為奇數那麼就在,否則就不在。那麼我們考慮狀態壓縮fi,j,sf fi,j,s 表示走...

JZOJ4016 雅禮聯考DAY01 圈地為王

在 n 行 m 列的網格中,你要圈一些地。你從左上角出發,最後返回左上角,路徑內部的區域視為被你圈住。你不可以進入網格內部,只能在邊上行走。你的路徑不能在左上角以外自交,但是邊足夠寬,你可以重複經過而不自交。網格中有一些格仔對你很重要,你要盡量圈住它 而另一些格仔對你有壞處,你不能圈住它。求圈住 i...