在\(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...