最近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 ...