NOI2011 洛谷 兔兔與蛋蛋遊戲

2021-10-06 21:31:21 字數 2155 閱讀 7549

初見安~這裡是傳送門:洛谷p1971 [noi2011]兔兔與蛋蛋遊戲

這種題啊……就只能多悟,才能看到了就知道怎麼做【bushi。

看題目的操作:每次交替移動黑白棋子。然後就可以想到二分圖了【??!什麼鬼。

空白格仔從初始到終點走的路徑上的格仔都是與之交換過的,並且黑白相間,該路徑與以前走過的路徑不可能有交點。轉化到二分圖則是:把黑格仔的點放一邊,白格仔的點放一邊,每次操作都是從一邊移動到另一邊。

上文是用二分圖模擬這個過程,現在我們再來看如何判定。因為都採用最優策略,所以如果從乙個點出發後最多可以走奇數條邊,那麼先手必勝,反之後手必勝。這個很好理解。那麼換到這個題上,如果兔兔本來在的點有先手必勝策略,但操作過後讓蛋蛋有了先手必勝策略,那麼這一步就是錯的。對於最大邊數的判定我們可以用到二分圖匹配。即我們先求出乙個最大匹配,假設當前點是u,在最大匹配中,如果把u刪掉後還能找到新的增廣路來代替,那麼u先手必敗。很好理解——u是匹配點,那麼路徑應該是匹配邊—非匹配邊—匹配邊.. 刪去後:非匹配邊—匹配邊—...匹配邊,最後一定是匹配邊結尾【否則就有新的增廣路了,同理一條非匹配邊後也一定能找到一條匹配邊走下一步】,也就是說u作為匹配點時是非匹配邊結尾,那麼邊數就是偶數的,先手必敗

綜上——我們先求出該二分圖的最大匹配,再按照實際的下棋順序模擬過程,求出每一步時的點是否有必勝策略,再單獨看兔兔走的點即可【因為要統計有多少步】

上**——

#include#include#include#include#include#include#define maxn 50

#define maxk 2005

using namespace std;

typedef long long ll;

int read()

while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();

return x * f;

}char a[maxn][maxn];

int n, m, mp[maxn][maxn], s, t, q;

struct edge e[9000000];

int head[maxn * maxn], k = 0;

void add(int u, int v) ; head[u] = k++;}

int dir[4][2] = , , , };

int id[maxn][maxn], mat[maxn * maxn], ans[maxk], tot = 0;

bool vis[maxn * maxn], ban[maxn * maxn], win[maxk];

bool in(int x, int y)

bool dfs(int u)

} return false;

}signed main()

for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) //連邊

for(int p = 0; p < 4; p++)

for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(mp[i][j] == 2)//求增廣路

memset(vis, 0, sizeof vis), dfs(id[i][j]);

q = read();

for(int i = 1; i <= q * 2; i++)

s = read(), t = read(); }

for(int i = 1; i <= q; i++) if(win[i * 2 - 1] && win[i * 2]) ans[++tot] = i;

printf("%d\n", tot);

for(int i = 1; i <= tot; i++) printf("%d\n", ans[i]);

return 0;

}

迎評:)

——end——

Noi2011 兔兔與蛋蛋

題目 題解容易想到空格移動的路徑是不會自交的。因為空格移動的路徑是黑白棋相間的 所以對棋盤進行黑白染色,建立二分圖 如果黑白兩格上的棋子不一樣則可以連邊 如果乙個人 a 將空格移入了乙個在最大匹配內的點,那麼它的對手 b 就可以沿著匹配邊前進 否則就相當於找到了一條新的匹配邊 而a只能沿著非匹配邊前...

NOI2011 兔兔與蛋蛋遊戲

傳送門 直接博弈論dfs可以得到75分 然鵝我博弈論學的很pie include define ll long long define inf 10000 using namespace std intread while s 0 s 9 return x f char s 45 int lr ud...

bzoj2437 Noi2011 兔兔與蛋蛋

先把棋盤黑白染色,那麼對於o,當且僅當它所處的格仔顏色和空格不一樣才會移動,x相似,那麼對於這些o x,最多也就是被移動1次而已。同時每次空格每次移動所處顏色都是在改變 那麼就是二分圖博弈啊。而走一步相當於刪除乙個點,然後每次就讓被刪的那個點去找增廣路,找到了就必敗,反之必勝。蛋蛋走完必勝,兔兔再走...