bzoj4213 貪吃蛇 有上下界的費用流

2021-07-14 10:03:58 字數 2136 閱讀 7280

最近lwher迷上了貪吃蛇遊戲,在玩了幾天卻從未佔滿全地圖的情況下,他不得不承認自己是乙個弱菜,只能改去開發一款更弱的貪吃蛇遊戲。

在開發的過程中,lwher腦洞大開,搞了乙個多條蛇的模式。但由於這種模式太難操作,於是他只好改變遊戲的玩法,稍微變化一下遊戲目標。

新的遊戲是這樣的:

一些蛇覆蓋了乙個網格。每個格仔要麼是乙個障礙物,要麼是蛇的一部分。每條蛇佔據了一條折線(拐角處只能水平和豎直連線),且只是佔據兩個格仔。蛇與蛇之間不能重疊,蛇也不會與自己重疊。每條蛇還必須滿足以下兩個條件中的乙個:

1、兩個端點所在的格仔在網格的邊界。

2、蛇構成乙個環,即兩個端點相鄰(垂直或水平,不能斜著),至少要佔據4個格仔(否則沒法形成環)。

給定乙個網格,用r x c的字元矩陣描述:『#』代表障礙物,『.』代表空地。在滿足前面所述的條件下覆蓋所有空地,並使得端點在網格邊界(即不構成環)的蛇盡量少。(如果一條蛇既構成環,又是端點在邊界,那麼不計入答案)

例如,以下網格:

可以由下面三種方案覆蓋。還有其他的方案,但是沒法僅用一條不構成環的蛇就覆蓋整個網路的方案。

給定乙個網路的描述,輸出最少需要多少條不構成環的蛇來覆蓋這個網格。如果不存在能夠覆蓋網格的方案,輸出-1。

乙個字元矩陣,行數和列數不超過12。輸入檔案中沒有多餘的空白字元,每行之後都有換行符。

輸出滿足題目要求的那個整數。

......

.#.##.

.#....

....#.

.##.#.

......2

題解:

考慮一條不構成環的蛇,除了頭尾之外的點,每個點都與兩個點相連.

而環形蛇則所有點都與兩個點相連.

所以我們對矩陣黑白染色.建立源點s,匯點t.

s向所有白點連容量為2,費用為0的邊,表示這個點需要與兩個點相連.

所有黑點向t連容量為2,費用為0的邊,表示兩個點需要與這個點相連.

這裡的容量為2是指容量必須為2,需要上下界來限定.

每個白點向周圍的黑點連容量為1,費用為0的邊,表示這個點可以和周圍的點形成蛇.

這裡的容量並不要求一定是1,不需要用上下界來限定

每個邊界上的白點向t連容量為1,費用為1的邊,表示形成了一條不成環的蛇.

s向每個邊界上的黑點連容量為1,費用為1的邊,表示形成了一條不成環的蛇.

然後用有源有匯有上下界的費用流處理即可.

注意每條蛇會在頭和尾各算一次,所以最後答案需要除2.

**:

#include#include#include#define n 200

#define m 2000

#define inf 210000000

using namespace std;

int point[n],next[m<<1],ans,m,n=1,cnt=1,d[n],s,t,s,t,q[n*30],f[n];

int cur[n],pre[n],gap[n],dis[n],dx=,dy=;

char ch[n][n];

struct usee[m<<1];

int cal(int x,int y)

void add(int x,int y,int v,int c)

}} return dis[t]!=inf;

}void solve()

}bool check()

void build()

}else

}for (int i=1;i<=t;i++)

if (d[i]>0) add(s,i,d[i],0);

else if (d[i]<0)add(i,t,-d[i],0);

add(t,s,inf,0);

}int main(){

//freopen("a.in","r",stdin);

//freopen("a.out","w",stdout);

while (scanf("%s",ch[n]+1)!=eof) n++;n--;

m=strlen(ch[n]+1);

s=n*m+1;t=s+1;s=t+1;t=s+1;

build();

while (spfa()) solve();

if (!check()){

cout<

UOJ 4213 貪吃蛇(上下界可行費用流)

思路 限制每個點的度數為2 邊界點的度數可以花費1的代價減少1個度數 坑點 我tm以後再也不用 r 的優先順序了,這個玩意在 c 和 c 11中不一樣,而且tm錯都不知道咋錯的,我tm調了乙個晚上就tm這麼沒了。include using namespace std typedef int lint...

貪吃蛇專案(用ncurse捕獲鍵盤的上下左右鍵)

1.使用ncurse的好處 ncurse封裝了一些庫,不需要通過按下回車來改變鍵盤的方向 2.如何使用ncurse 標頭檔案 include 1 initscr 是ncurse介面的初始化函式 2 printw 是ncurse模式下的printf 3 getch 等待使用者輸入,如果沒有這句話,程式...

bzoj 2406 矩陣 (有上下界的網路流)

time limit 10 sec memory limit 128 mb submit 229 solved 90 submit status discuss 第一行兩個數n m,表示矩陣的大小。接下來n 行,每行 m列,描述矩陣a。最後一行兩個數l,r。第一行,輸出最小的答案 2 20 1 2 ...